Home | History | Annotate | Download | only in libloc_api_50001
      1 /* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
      2  *
      3  * Redistribution and use in source and binary forms, with or without
      4  * modification, are permitted provided that the following conditions are
      5  * met:
      6  *     * Redistributions of source code must retain the above copyright
      7  *       notice, this list of conditions and the following disclaimer.
      8  *     * Redistributions in binary form must reproduce the above
      9  *       copyright notice, this list of conditions and the following
     10  *       disclaimer in the documentation and/or other materials provided
     11  *       with the distribution.
     12  *     * Neither the name of The Linux Foundation, nor the names of its
     13  *       contributors may be used to endorse or promote products derived
     14  *       from this software without specific prior written permission.
     15  *
     16  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
     17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
     19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
     20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     23  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     25  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
     26  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  *
     28  */
     29 
     30 #define LOG_NDDEBUG 0
     31 #define LOG_TAG "LocSvc_afw"
     32 
     33 #include <hardware/gps.h>
     34 #include <gps_extended.h>
     35 #include <loc_eng.h>
     36 #include <loc_target.h>
     37 #include <loc_log.h>
     38 #include <fcntl.h>
     39 #include <errno.h>
     40 #include <dlfcn.h>
     41 #include <sys/types.h>
     42 #include <sys/stat.h>
     43 #include <fcntl.h>
     44 #include <errno.h>
     45 #include <LocDualContext.h>
     46 #include <cutils/properties.h>
     47 
     48 using namespace loc_core;
     49 
     50 //Globals defns
     51 static gps_location_callback gps_loc_cb = NULL;
     52 static gps_sv_status_callback gps_sv_cb = NULL;
     53 
     54 static void local_loc_cb(UlpLocation* location, void* locExt);
     55 static void local_sv_cb(GpsSvStatus* sv_status, void* svExt);
     56 
     57 static const GpsGeofencingInterface* get_geofence_interface(void);
     58 
     59 // Function declarations for sLocEngInterface
     60 static int  loc_init(GpsCallbacks* callbacks);
     61 static int  loc_start();
     62 static int  loc_stop();
     63 static void loc_cleanup();
     64 static int  loc_inject_time(GpsUtcTime time, int64_t timeReference, int uncertainty);
     65 static int  loc_inject_location(double latitude, double longitude, float accuracy);
     66 static void loc_delete_aiding_data(GpsAidingData f);
     67 static int  loc_set_position_mode(GpsPositionMode mode, GpsPositionRecurrence recurrence,
     68                                   uint32_t min_interval, uint32_t preferred_accuracy,
     69                                   uint32_t preferred_time);
     70 static const void* loc_get_extension(const char* name);
     71 
     72 // Defines the GpsInterface in gps.h
     73 static const GpsInterface sLocEngInterface =
     74 {
     75    sizeof(GpsInterface),
     76    loc_init,
     77    loc_start,
     78    loc_stop,
     79    loc_cleanup,
     80    loc_inject_time,
     81    loc_inject_location,
     82    loc_delete_aiding_data,
     83    loc_set_position_mode,
     84    loc_get_extension
     85 };
     86 
     87 // Function declarations for sLocEngAGpsInterface
     88 static void loc_agps_init(AGpsCallbacks* callbacks);
     89 static int  loc_agps_open(const char* apn);
     90 static int  loc_agps_closed();
     91 static int  loc_agps_open_failed();
     92 static int  loc_agps_set_server(AGpsType type, const char *hostname, int port);
     93 
     94 static const AGpsInterface_v1 sLocEngAGpsInterface =
     95 {
     96    sizeof(AGpsInterface_v1),
     97    loc_agps_init,
     98    loc_agps_open,
     99    loc_agps_closed,
    100    loc_agps_open_failed,
    101    loc_agps_set_server
    102 };
    103 
    104 static int loc_xtra_init(GpsXtraCallbacks* callbacks);
    105 static int loc_xtra_inject_data(char* data, int length);
    106 
    107 static const GpsXtraInterface sLocEngXTRAInterface =
    108 {
    109     sizeof(GpsXtraInterface),
    110     loc_xtra_init,
    111     loc_xtra_inject_data
    112 };
    113 
    114 static void loc_ni_init(GpsNiCallbacks *callbacks);
    115 static void loc_ni_respond(int notif_id, GpsUserResponseType user_response);
    116 
    117 const GpsNiInterface sLocEngNiInterface =
    118 {
    119    sizeof(GpsNiInterface),
    120    loc_ni_init,
    121    loc_ni_respond,
    122 };
    123 
    124 static void loc_agps_ril_init( AGpsRilCallbacks* callbacks );
    125 static void loc_agps_ril_set_ref_location(const AGpsRefLocation *agps_reflocation, size_t sz_struct);
    126 static void loc_agps_ril_set_set_id(AGpsSetIDType type, const char* setid);
    127 static void loc_agps_ril_ni_message(uint8_t *msg, size_t len);
    128 static void loc_agps_ril_update_network_state(int connected, int type, int roaming, const char* extra_info);
    129 static void loc_agps_ril_update_network_availability(int avaiable, const char* apn);
    130 
    131 static const AGpsRilInterface sLocEngAGpsRilInterface =
    132 {
    133    sizeof(AGpsRilInterface),
    134    loc_agps_ril_init,
    135    loc_agps_ril_set_ref_location,
    136    loc_agps_ril_set_set_id,
    137    loc_agps_ril_ni_message,
    138    loc_agps_ril_update_network_state,
    139    loc_agps_ril_update_network_availability
    140 };
    141 
    142 static loc_eng_data_s_type loc_afw_data;
    143 static int gss_fd = 0;
    144 
    145 /*===========================================================================
    146 FUNCTION    gps_get_hardware_interface
    147 
    148 DESCRIPTION
    149    Returns the GPS hardware interaface based on LOC API
    150    if GPS is enabled.
    151 
    152 DEPENDENCIES
    153    None
    154 
    155 RETURN VALUE
    156    0: success
    157 
    158 SIDE EFFECTS
    159    N/A
    160 
    161 ===========================================================================*/
    162 const GpsInterface* gps_get_hardware_interface ()
    163 {
    164     ENTRY_LOG_CALLFLOW();
    165     const GpsInterface* ret_val;
    166 
    167     char propBuf[PROPERTY_VALUE_MAX];
    168 
    169     loc_eng_read_config();
    170 
    171     // check to see if GPS should be disabled
    172     property_get("gps.disable", propBuf, "");
    173     if (propBuf[0] == '1')
    174     {
    175         LOC_LOGD("gps_get_interface returning NULL because gps.disable=1\n");
    176         ret_val = NULL;
    177     } else {
    178         ret_val = &sLocEngInterface;
    179     }
    180 
    181     loc_eng_read_config();
    182 
    183     EXIT_LOG(%p, ret_val);
    184     return ret_val;
    185 }
    186 
    187 // for gps.c
    188 extern "C" const GpsInterface* get_gps_interface()
    189 {
    190     unsigned int target = TARGET_DEFAULT;
    191     loc_eng_read_config();
    192 
    193     target = get_target();
    194     LOC_LOGD("Target name check returned %s", loc_get_target_name(target));
    195         //APQ8064
    196         if( getTargetGnssType(target) == GNSS_GSS ) {
    197         gps_conf.CAPABILITIES &= ~(GPS_CAPABILITY_MSA | GPS_CAPABILITY_MSB);
    198         gss_fd = open("/dev/gss", O_RDONLY);
    199         if (gss_fd < 0) {
    200             LOC_LOGE("GSS open failed: %s\n", strerror(errno));
    201         }
    202         else {
    203             LOC_LOGD("GSS open success! CAPABILITIES %0lx\n",
    204                      gps_conf.CAPABILITIES);
    205         }
    206     }
    207     //MPQ8064
    208         else if( getTargetGnssType(target) == GNSS_NONE) {
    209         LOC_LOGE("No GPS HW on this target (MPQ8064). Not returning interface");
    210         return NULL;
    211     }
    212     return &sLocEngInterface;
    213 }
    214 
    215 /*===========================================================================
    216 FUNCTION    loc_init
    217 
    218 DESCRIPTION
    219    Initialize the location engine, this include setting up global datas
    220    and registers location engien with loc api service.
    221 
    222 DEPENDENCIES
    223    None
    224 
    225 RETURN VALUE
    226    0: success
    227 
    228 SIDE EFFECTS
    229    N/Ax
    230 
    231 ===========================================================================*/
    232 static int loc_init(GpsCallbacks* callbacks)
    233 {
    234     int retVal = -1;
    235     ENTRY_LOG();
    236     LOC_API_ADAPTER_EVENT_MASK_T event;
    237 
    238     if (NULL == callbacks) {
    239         LOC_LOGE("loc_init failed. cb = NULL\n");
    240         EXIT_LOG(%d, retVal);
    241         return retVal;
    242     }
    243 
    244     event = LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT |
    245             LOC_API_ADAPTER_BIT_SATELLITE_REPORT |
    246             LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST |
    247             LOC_API_ADAPTER_BIT_ASSISTANCE_DATA_REQUEST |
    248             LOC_API_ADAPTER_BIT_IOCTL_REPORT |
    249             LOC_API_ADAPTER_BIT_STATUS_REPORT |
    250             LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT |
    251             LOC_API_ADAPTER_BIT_NI_NOTIFY_VERIFY_REQUEST;
    252 
    253     LocCallbacks clientCallbacks = {local_loc_cb, /* location_cb */
    254                                     callbacks->status_cb, /* status_cb */
    255                                     local_sv_cb, /* sv_status_cb */
    256                                     callbacks->nmea_cb, /* nmea_cb */
    257                                     callbacks->set_capabilities_cb, /* set_capabilities_cb */
    258                                     callbacks->acquire_wakelock_cb, /* acquire_wakelock_cb */
    259                                     callbacks->release_wakelock_cb, /* release_wakelock_cb */
    260                                     callbacks->create_thread_cb, /* create_thread_cb */
    261                                     NULL, /* location_ext_parser */
    262                                     NULL, /* sv_ext_parser */
    263                                     callbacks->request_utc_time_cb /* request_utc_time_cb */};
    264 
    265     gps_loc_cb = callbacks->location_cb;
    266     gps_sv_cb = callbacks->sv_status_cb;
    267 
    268     retVal = loc_eng_init(loc_afw_data, &clientCallbacks, event);
    269     loc_afw_data.adapter->requestUlp(gps_conf.CAPABILITIES);
    270     loc_afw_data.adapter->mAgpsEnabled = !loc_afw_data.adapter->hasAgpsExt();
    271 
    272 
    273     EXIT_LOG(%d, retVal);
    274     return retVal;
    275 }
    276 
    277 /*===========================================================================
    278 FUNCTION    loc_cleanup
    279 
    280 DESCRIPTION
    281    Cleans location engine. The location client handle will be released.
    282 
    283 DEPENDENCIES
    284    None
    285 
    286 RETURN VALUE
    287    None
    288 
    289 SIDE EFFECTS
    290    N/A
    291 
    292 ===========================================================================*/
    293 static void loc_cleanup()
    294 {
    295     ENTRY_LOG();
    296     loc_eng_cleanup(loc_afw_data);
    297     gps_loc_cb = NULL;
    298     gps_sv_cb = NULL;
    299 
    300     /*
    301      * if (get_target() == TARGET_NAME_APQ8064_STANDALONE)
    302      * {
    303      *     close(gss_fd);
    304      *     LOC_LOGD("GSS shutdown.\n");
    305      * }
    306      */
    307 
    308     EXIT_LOG(%s, VOID_RET);
    309 }
    310 
    311 /*===========================================================================
    312 FUNCTION    loc_start
    313 
    314 DESCRIPTION
    315    Starts the tracking session
    316 
    317 DEPENDENCIES
    318    None
    319 
    320 RETURN VALUE
    321    0: success
    322 
    323 SIDE EFFECTS
    324    N/A
    325 
    326 ===========================================================================*/
    327 static int loc_start()
    328 {
    329     ENTRY_LOG();
    330     int ret_val = loc_eng_start(loc_afw_data);
    331 
    332     EXIT_LOG(%d, ret_val);
    333     return ret_val;
    334 }
    335 
    336 /*===========================================================================
    337 FUNCTION    loc_stop
    338 
    339 DESCRIPTION
    340    Stops the tracking session
    341 
    342 DEPENDENCIES
    343    None
    344 
    345 RETURN VALUE
    346    0: success
    347 
    348 SIDE EFFECTS
    349    N/A
    350 
    351 ===========================================================================*/
    352 static int loc_stop()
    353 {
    354     ENTRY_LOG();
    355     int ret_val = -1;
    356     ret_val = loc_eng_stop(loc_afw_data);
    357 
    358     EXIT_LOG(%d, ret_val);
    359     return ret_val;
    360 }
    361 
    362 /*===========================================================================
    363 FUNCTION    loc_set_position_mode
    364 
    365 DESCRIPTION
    366    Sets the mode and fix frequency for the tracking session.
    367 
    368 DEPENDENCIES
    369    None
    370 
    371 RETURN VALUE
    372    0: success
    373 
    374 SIDE EFFECTS
    375    N/A
    376 
    377 ===========================================================================*/
    378 static int  loc_set_position_mode(GpsPositionMode mode,
    379                                   GpsPositionRecurrence recurrence,
    380                                   uint32_t min_interval,
    381                                   uint32_t preferred_accuracy,
    382                                   uint32_t preferred_time)
    383 {
    384     ENTRY_LOG();
    385     int ret_val = -1;
    386     LocPositionMode locMode;
    387     switch (mode) {
    388     case GPS_POSITION_MODE_MS_BASED:
    389         locMode = LOC_POSITION_MODE_MS_BASED;
    390         break;
    391     case GPS_POSITION_MODE_MS_ASSISTED:
    392         locMode = LOC_POSITION_MODE_MS_ASSISTED;
    393         break;
    394     default:
    395         locMode = LOC_POSITION_MODE_STANDALONE;
    396         break;
    397     }
    398 
    399     LocPosMode params(locMode, recurrence, min_interval,
    400                       preferred_accuracy, preferred_time, NULL, NULL);
    401     ret_val = loc_eng_set_position_mode(loc_afw_data, params);
    402 
    403     EXIT_LOG(%d, ret_val);
    404     return ret_val;
    405 }
    406 
    407 /*===========================================================================
    408 FUNCTION    loc_inject_time
    409 
    410 DESCRIPTION
    411    This is used by Java native function to do time injection.
    412 
    413 DEPENDENCIES
    414    None
    415 
    416 RETURN VALUE
    417    0
    418 
    419 SIDE EFFECTS
    420    N/A
    421 
    422 ===========================================================================*/
    423 static int loc_inject_time(GpsUtcTime time, int64_t timeReference, int uncertainty)
    424 {
    425     ENTRY_LOG();
    426     int ret_val = 0;
    427 
    428     ret_val = loc_eng_inject_time(loc_afw_data, time,
    429                                   timeReference, uncertainty);
    430 
    431     EXIT_LOG(%d, ret_val);
    432     return ret_val;
    433 }
    434 
    435 
    436 /*===========================================================================
    437 FUNCTION    loc_inject_location
    438 
    439 DESCRIPTION
    440    This is used by Java native function to do location injection.
    441 
    442 DEPENDENCIES
    443    None
    444 
    445 RETURN VALUE
    446    0          : Successful
    447    error code : Failure
    448 
    449 SIDE EFFECTS
    450    N/A
    451 ===========================================================================*/
    452 static int loc_inject_location(double latitude, double longitude, float accuracy)
    453 {
    454     static bool initialized = false;
    455     static bool enable_cpi = true;
    456     ENTRY_LOG();
    457 
    458     if(!initialized)
    459     {
    460         char value[PROPERTY_VALUE_MAX];
    461         memset(value, 0, sizeof(value));
    462         (void)property_get("persist.gps.qc_nlp_in_use", value, "0");
    463         if(0 == strcmp(value, "1"))
    464         {
    465             enable_cpi = false;
    466             LOC_LOGI("GPS HAL coarse position injection disabled");
    467         }
    468         else
    469         {
    470             LOC_LOGI("GPS HAL coarse position injection enabled");
    471         }
    472         initialized = true;
    473     }
    474 
    475     int ret_val = 0;
    476     if(enable_cpi)
    477     {
    478       ret_val = loc_eng_inject_location(loc_afw_data, latitude, longitude, accuracy);
    479     }
    480     EXIT_LOG(%d, ret_val);
    481     return ret_val;
    482 }
    483 
    484 
    485 /*===========================================================================
    486 FUNCTION    loc_delete_aiding_data
    487 
    488 DESCRIPTION
    489    This is used by Java native function to delete the aiding data. The function
    490    updates the global variable for the aiding data to be deleted. If the GPS
    491    engine is off, the aiding data will be deleted. Otherwise, the actual action
    492    will happen when gps engine is turned off.
    493 
    494 DEPENDENCIES
    495    Assumes the aiding data type specified in GpsAidingData matches with
    496    LOC API specification.
    497 
    498 RETURN VALUE
    499    None
    500 
    501 SIDE EFFECTS
    502    N/A
    503 
    504 ===========================================================================*/
    505 static void loc_delete_aiding_data(GpsAidingData f)
    506 {
    507     ENTRY_LOG();
    508     loc_eng_delete_aiding_data(loc_afw_data, f);
    509 
    510     EXIT_LOG(%s, VOID_RET);
    511 }
    512 
    513 const GpsGeofencingInterface* get_geofence_interface(void)
    514 {
    515     ENTRY_LOG();
    516     void *handle;
    517     const char *error;
    518     typedef const GpsGeofencingInterface* (*get_gps_geofence_interface_function) (void);
    519     get_gps_geofence_interface_function get_gps_geofence_interface;
    520     static const GpsGeofencingInterface* geofence_interface = NULL;
    521 
    522     dlerror();    /* Clear any existing error */
    523 
    524     handle = dlopen ("libgeofence.so", RTLD_NOW);
    525 
    526     if (!handle)
    527     {
    528         if ((error = dlerror()) != NULL)  {
    529             LOC_LOGE ("%s, dlopen for libgeofence.so failed, error = %s\n", __func__, error);
    530            }
    531         goto exit;
    532     }
    533     dlerror();    /* Clear any existing error */
    534     get_gps_geofence_interface = (get_gps_geofence_interface_function)dlsym(handle, "gps_geofence_get_interface");
    535     if ((error = dlerror()) != NULL)  {
    536         LOC_LOGE ("%s, dlsym for get_gps_geofence_interface failed, error = %s\n", __func__, error);
    537         goto exit;
    538      }
    539 
    540     geofence_interface = get_gps_geofence_interface();
    541 
    542 exit:
    543     EXIT_LOG(%d, geofence_interface == NULL);
    544     return geofence_interface;
    545 }
    546 /*===========================================================================
    547 FUNCTION    loc_get_extension
    548 
    549 DESCRIPTION
    550    Get the gps extension to support XTRA.
    551 
    552 DEPENDENCIES
    553    N/A
    554 
    555 RETURN VALUE
    556    The GPS extension interface.
    557 
    558 SIDE EFFECTS
    559    N/A
    560 
    561 ===========================================================================*/
    562 const void* loc_get_extension(const char* name)
    563 {
    564     ENTRY_LOG();
    565     const void* ret_val = NULL;
    566 
    567    LOC_LOGD("%s:%d] For Interface = %s\n",__func__, __LINE__, name);
    568    if (strcmp(name, GPS_XTRA_INTERFACE) == 0)
    569    {
    570        ret_val = &sLocEngXTRAInterface;
    571    }
    572    else if (strcmp(name, AGPS_INTERFACE) == 0)
    573    {
    574        //Return an interface to AGPS only if MSA or MSB capabilities
    575        //are present. If the target is an APQ, these masks are
    576        //cleared in get_gps_interface() and the below logic will
    577        //return NULL as the interface for AGPS
    578        if((gps_conf.CAPABILITIES & GPS_CAPABILITY_MSA) ||
    579           (gps_conf.CAPABILITIES & GPS_CAPABILITY_MSB) ) {
    580            LOC_LOGD("%s:%d]: AGPS capabilities found\n", __func__, __LINE__);
    581            ret_val = &sLocEngAGpsInterface;
    582        }
    583        else {
    584            LOC_LOGD("%s:%d]: Returning NULL AgpsInterface\n", __func__, __LINE__);
    585            ret_val = NULL;
    586        }
    587    }
    588    else if (strcmp(name, GPS_NI_INTERFACE) == 0)
    589    {
    590        ret_val = &sLocEngNiInterface;
    591    }
    592    else if (strcmp(name, AGPS_RIL_INTERFACE) == 0)
    593    {
    594        char baseband[PROPERTY_VALUE_MAX];
    595        property_get("ro.baseband", baseband, "msm");
    596        if (strcmp(baseband, "csfb") == 0)
    597        {
    598            ret_val = &sLocEngAGpsRilInterface;
    599        }
    600    }
    601    else if (strcmp(name, GPS_GEOFENCING_INTERFACE) == 0)
    602    {
    603        if ((gps_conf.CAPABILITIES | GPS_CAPABILITY_GEOFENCING) == gps_conf.CAPABILITIES ){
    604            ret_val = get_geofence_interface();
    605        }
    606    }
    607    else
    608    {
    609       LOC_LOGE ("get_extension: Invalid interface passed in\n");
    610    }
    611     EXIT_LOG(%p, ret_val);
    612     return ret_val;
    613 }
    614 
    615 /*===========================================================================
    616 FUNCTION    loc_agps_init
    617 
    618 DESCRIPTION
    619    Initialize the AGps interface.
    620 
    621 DEPENDENCIES
    622    NONE
    623 
    624 RETURN VALUE
    625    0
    626 
    627 SIDE EFFECTS
    628    N/A
    629 
    630 ===========================================================================*/
    631 static void loc_agps_init(AGpsCallbacks* callbacks)
    632 {
    633     ENTRY_LOG();
    634     loc_eng_agps_init(loc_afw_data, (AGpsExtCallbacks*)callbacks);
    635     EXIT_LOG(%s, VOID_RET);
    636 }
    637 
    638 /*===========================================================================
    639 FUNCTION    loc_agps_open
    640 
    641 DESCRIPTION
    642    This function is called when on-demand data connection opening is successful.
    643 It should inform ARM 9 about the data open result.
    644 
    645 DEPENDENCIES
    646    NONE
    647 
    648 RETURN VALUE
    649    0
    650 
    651 SIDE EFFECTS
    652    N/A
    653 
    654 ===========================================================================*/
    655 static int loc_agps_open(const char* apn)
    656 {
    657     ENTRY_LOG();
    658     AGpsType agpsType = AGPS_TYPE_SUPL;
    659     AGpsBearerType bearerType = AGPS_APN_BEARER_IPV4;
    660     int ret_val = loc_eng_agps_open(loc_afw_data, agpsType, apn, bearerType);
    661 
    662     EXIT_LOG(%d, ret_val);
    663     return ret_val;
    664 }
    665 
    666 /*===========================================================================
    667 FUNCTION    loc_agps_closed
    668 
    669 DESCRIPTION
    670    This function is called when on-demand data connection closing is done.
    671 It should inform ARM 9 about the data close result.
    672 
    673 DEPENDENCIES
    674    NONE
    675 
    676 RETURN VALUE
    677    0
    678 
    679 SIDE EFFECTS
    680    N/A
    681 
    682 ===========================================================================*/
    683 static int loc_agps_closed()
    684 {
    685     ENTRY_LOG();
    686     AGpsType agpsType = AGPS_TYPE_SUPL;
    687     int ret_val = loc_eng_agps_closed(loc_afw_data, agpsType);
    688 
    689     EXIT_LOG(%d, ret_val);
    690     return ret_val;
    691 }
    692 
    693 /*===========================================================================
    694 FUNCTION    loc_agps_open_failed
    695 
    696 DESCRIPTION
    697    This function is called when on-demand data connection opening has failed.
    698 It should inform ARM 9 about the data open result.
    699 
    700 DEPENDENCIES
    701    NONE
    702 
    703 RETURN VALUE
    704    0
    705 
    706 SIDE EFFECTS
    707    N/A
    708 
    709 ===========================================================================*/
    710 int loc_agps_open_failed()
    711 {
    712     ENTRY_LOG();
    713     AGpsType agpsType = AGPS_TYPE_SUPL;
    714     int ret_val = loc_eng_agps_open_failed(loc_afw_data, agpsType);
    715 
    716     EXIT_LOG(%d, ret_val);
    717     return ret_val;
    718 }
    719 
    720 /*===========================================================================
    721 FUNCTION    loc_agps_set_server
    722 
    723 DESCRIPTION
    724    If loc_eng_set_server is called before loc_eng_init, it doesn't work. This
    725    proxy buffers server settings and calls loc_eng_set_server when the client is
    726    open.
    727 
    728 DEPENDENCIES
    729    NONE
    730 
    731 RETURN VALUE
    732    0
    733 
    734 SIDE EFFECTS
    735    N/A
    736 
    737 ===========================================================================*/
    738 static int loc_agps_set_server(AGpsType type, const char* hostname, int port)
    739 {
    740     ENTRY_LOG();
    741     LocServerType serverType;
    742     switch (type) {
    743     case AGPS_TYPE_SUPL:
    744         serverType = LOC_AGPS_SUPL_SERVER;
    745         break;
    746     case AGPS_TYPE_C2K:
    747         serverType = LOC_AGPS_CDMA_PDE_SERVER;
    748         break;
    749     default:
    750         serverType = LOC_AGPS_SUPL_SERVER;
    751     }
    752     int ret_val = loc_eng_set_server_proxy(loc_afw_data, serverType, hostname, port);
    753 
    754     EXIT_LOG(%d, ret_val);
    755     return ret_val;
    756 }
    757 
    758 /*===========================================================================
    759 FUNCTIONf571
    760     loc_xtra_init
    761 
    762 DESCRIPTION
    763    Initialize XTRA module.
    764 
    765 DEPENDENCIES
    766    None
    767 
    768 RETURN VALUE
    769    0: success
    770 
    771 SIDE EFFECTS
    772    N/A
    773 
    774 ===========================================================================*/
    775 static int loc_xtra_init(GpsXtraCallbacks* callbacks)
    776 {
    777     ENTRY_LOG();
    778     int ret_val = loc_eng_xtra_init(loc_afw_data, (GpsXtraExtCallbacks*)callbacks);
    779 
    780     EXIT_LOG(%d, ret_val);
    781     return ret_val;
    782 }
    783 
    784 
    785 /*===========================================================================
    786 FUNCTION    loc_xtra_inject_data
    787 
    788 DESCRIPTION
    789    Initialize XTRA module.
    790 
    791 DEPENDENCIES
    792    None
    793 
    794 RETURN VALUE
    795    0: success
    796 
    797 SIDE EFFECTS
    798    N/A
    799 
    800 ===========================================================================*/
    801 static int loc_xtra_inject_data(char* data, int length)
    802 {
    803     ENTRY_LOG();
    804     int ret_val = -1;
    805     if( (data != NULL) && ((unsigned int)length <= XTRA_DATA_MAX_SIZE))
    806         ret_val = loc_eng_xtra_inject_data(loc_afw_data, data, length);
    807     else
    808         LOC_LOGE("%s, Could not inject XTRA data. Buffer address: %p, length: %d",
    809                 __func__, data, length);
    810     EXIT_LOG(%d, ret_val);
    811     return ret_val;
    812 }
    813 
    814 /*===========================================================================
    815 FUNCTION    loc_ni_init
    816 
    817 DESCRIPTION
    818    This function initializes the NI interface
    819 
    820 DEPENDENCIES
    821    NONE
    822 
    823 RETURN VALUE
    824    None
    825 
    826 SIDE EFFECTS
    827    N/A
    828 
    829 ===========================================================================*/
    830 void loc_ni_init(GpsNiCallbacks *callbacks)
    831 {
    832     ENTRY_LOG();
    833     loc_eng_ni_init(loc_afw_data,(GpsNiExtCallbacks*) callbacks);
    834     EXIT_LOG(%s, VOID_RET);
    835 }
    836 
    837 /*===========================================================================
    838 FUNCTION    loc_ni_respond
    839 
    840 DESCRIPTION
    841    This function sends an NI respond to the modem processor
    842 
    843 DEPENDENCIES
    844    NONE
    845 
    846 RETURN VALUE
    847    None
    848 
    849 SIDE EFFECTS
    850    N/A
    851 
    852 ===========================================================================*/
    853 void loc_ni_respond(int notif_id, GpsUserResponseType user_response)
    854 {
    855     ENTRY_LOG();
    856     loc_eng_ni_respond(loc_afw_data, notif_id, user_response);
    857     EXIT_LOG(%s, VOID_RET);
    858 }
    859 
    860 // Below stub functions are members of sLocEngAGpsRilInterface
    861 static void loc_agps_ril_init( AGpsRilCallbacks* callbacks ) {}
    862 static void loc_agps_ril_set_ref_location(const AGpsRefLocation *agps_reflocation, size_t sz_struct) {}
    863 static void loc_agps_ril_set_set_id(AGpsSetIDType type, const char* setid) {}
    864 static void loc_agps_ril_ni_message(uint8_t *msg, size_t len) {}
    865 static void loc_agps_ril_update_network_state(int connected, int type, int roaming, const char* extra_info) {}
    866 
    867 /*===========================================================================
    868 FUNCTION    loc_agps_ril_update_network_availability
    869 
    870 DESCRIPTION
    871    Sets data call allow vs disallow flag to modem
    872    This is the only member of sLocEngAGpsRilInterface implemented.
    873 
    874 DEPENDENCIES
    875    None
    876 
    877 RETURN VALUE
    878    0: success
    879 
    880 SIDE EFFECTS
    881    N/A
    882 
    883 ===========================================================================*/
    884 static void loc_agps_ril_update_network_availability(int available, const char* apn)
    885 {
    886     ENTRY_LOG();
    887     loc_eng_agps_ril_update_network_availability(loc_afw_data, available, apn);
    888     EXIT_LOG(%s, VOID_RET);
    889 }
    890 
    891 static void local_loc_cb(UlpLocation* location, void* locExt)
    892 {
    893     ENTRY_LOG();
    894     if (NULL != location) {
    895         CALLBACK_LOG_CALLFLOW("location_cb - from", %d, location->position_source);
    896 
    897         if (NULL != gps_loc_cb) {
    898             gps_loc_cb(&location->gpsLocation);
    899         }
    900     }
    901     EXIT_LOG(%s, VOID_RET);
    902 }
    903 
    904 static void local_sv_cb(GpsSvStatus* sv_status, void* svExt)
    905 {
    906     ENTRY_LOG();
    907     if (NULL != gps_sv_cb) {
    908         CALLBACK_LOG_CALLFLOW("sv_status_cb -", %d, sv_status->num_svs);
    909         gps_sv_cb(sv_status);
    910     }
    911     EXIT_LOG(%s, VOID_RET);
    912 }
    913