147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo/* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved.
234ee09551764b045fdc02df754157473125edf60Kevin Tang *
334ee09551764b045fdc02df754157473125edf60Kevin Tang * Redistribution and use in source and binary forms, with or without
434ee09551764b045fdc02df754157473125edf60Kevin Tang * modification, are permitted provided that the following conditions are
534ee09551764b045fdc02df754157473125edf60Kevin Tang * met:
634ee09551764b045fdc02df754157473125edf60Kevin Tang *     * Redistributions of source code must retain the above copyright
734ee09551764b045fdc02df754157473125edf60Kevin Tang *       notice, this list of conditions and the following disclaimer.
834ee09551764b045fdc02df754157473125edf60Kevin Tang *     * Redistributions in binary form must reproduce the above
934ee09551764b045fdc02df754157473125edf60Kevin Tang *       copyright notice, this list of conditions and the following
1034ee09551764b045fdc02df754157473125edf60Kevin Tang *       disclaimer in the documentation and/or other materials provided
1134ee09551764b045fdc02df754157473125edf60Kevin Tang *       with the distribution.
12e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo *     * Neither the name of The Linux Foundation, nor the names of its
1334ee09551764b045fdc02df754157473125edf60Kevin Tang *       contributors may be used to endorse or promote products derived
1434ee09551764b045fdc02df754157473125edf60Kevin Tang *       from this software without specific prior written permission.
1534ee09551764b045fdc02df754157473125edf60Kevin Tang *
1634ee09551764b045fdc02df754157473125edf60Kevin Tang * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
1734ee09551764b045fdc02df754157473125edf60Kevin Tang * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1834ee09551764b045fdc02df754157473125edf60Kevin Tang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
1934ee09551764b045fdc02df754157473125edf60Kevin Tang * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
2034ee09551764b045fdc02df754157473125edf60Kevin Tang * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2134ee09551764b045fdc02df754157473125edf60Kevin Tang * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2234ee09551764b045fdc02df754157473125edf60Kevin Tang * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2334ee09551764b045fdc02df754157473125edf60Kevin Tang * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2434ee09551764b045fdc02df754157473125edf60Kevin Tang * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
2534ee09551764b045fdc02df754157473125edf60Kevin Tang * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2634ee09551764b045fdc02df754157473125edf60Kevin Tang * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2734ee09551764b045fdc02df754157473125edf60Kevin Tang *
2834ee09551764b045fdc02df754157473125edf60Kevin Tang */
2934ee09551764b045fdc02df754157473125edf60Kevin Tang
3034ee09551764b045fdc02df754157473125edf60Kevin Tang#define LOG_NDDEBUG 0
3134ee09551764b045fdc02df754157473125edf60Kevin Tang#define LOG_TAG "LocSvc_afw"
3234ee09551764b045fdc02df754157473125edf60Kevin Tang
3334ee09551764b045fdc02df754157473125edf60Kevin Tang#include <hardware/gps.h>
34e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <gps_extended.h>
3534ee09551764b045fdc02df754157473125edf60Kevin Tang#include <loc_eng.h>
36e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <loc_target.h>
3734ee09551764b045fdc02df754157473125edf60Kevin Tang#include <loc_log.h>
38c65fed03538cb5e4a5b62d3ca114ff3cc5e87e60Mekala Natarajan#include <fcntl.h>
39c65fed03538cb5e4a5b62d3ca114ff3cc5e87e60Mekala Natarajan#include <errno.h>
40e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <dlfcn.h>
41e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <sys/types.h>
42e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <sys/stat.h>
43e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <fcntl.h>
44e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <errno.h>
45e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <LocDualContext.h>
46e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <cutils/properties.h>
472863c4092108a764d8537b453e66357939e19062Kevin Tang#include <sys/socket.h>
482863c4092108a764d8537b453e66357939e19062Kevin Tang#include <sys/un.h>
492863c4092108a764d8537b453e66357939e19062Kevin Tang#include <sstream>
502863c4092108a764d8537b453e66357939e19062Kevin Tang#include <string>
5187543bf77178d77edc23ed0043b76c0eb6ec3eccDante Russo
52e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russousing namespace loc_core;
53e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
54bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define LOC_PM_CLIENT_NAME "GPS"
55bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
56e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo//Globals defns
5734ee09551764b045fdc02df754157473125edf60Kevin Tangstatic gps_location_callback gps_loc_cb = NULL;
5834ee09551764b045fdc02df754157473125edf60Kevin Tangstatic gps_sv_status_callback gps_sv_cb = NULL;
5934ee09551764b045fdc02df754157473125edf60Kevin Tang
60e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russostatic void local_loc_cb(UlpLocation* location, void* locExt);
61e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russostatic void local_sv_cb(GpsSvStatus* sv_status, void* svExt);
6234ee09551764b045fdc02df754157473125edf60Kevin Tang
6323d1e163c382baf6f395af46b34d309db0cb5c29Dante Russostatic const GpsGeofencingInterface* get_geofence_interface(void);
6423d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo
6534ee09551764b045fdc02df754157473125edf60Kevin Tang// Function declarations for sLocEngInterface
6634ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int  loc_init(GpsCallbacks* callbacks);
6734ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int  loc_start();
6834ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int  loc_stop();
6934ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void loc_cleanup();
7034ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int  loc_inject_time(GpsUtcTime time, int64_t timeReference, int uncertainty);
7134ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int  loc_inject_location(double latitude, double longitude, float accuracy);
7234ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void loc_delete_aiding_data(GpsAidingData f);
7334ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int  loc_set_position_mode(GpsPositionMode mode, GpsPositionRecurrence recurrence,
7434ee09551764b045fdc02df754157473125edf60Kevin Tang                                  uint32_t min_interval, uint32_t preferred_accuracy,
7534ee09551764b045fdc02df754157473125edf60Kevin Tang                                  uint32_t preferred_time);
7634ee09551764b045fdc02df754157473125edf60Kevin Tangstatic const void* loc_get_extension(const char* name);
7734ee09551764b045fdc02df754157473125edf60Kevin Tang// Defines the GpsInterface in gps.h
7834ee09551764b045fdc02df754157473125edf60Kevin Tangstatic const GpsInterface sLocEngInterface =
7934ee09551764b045fdc02df754157473125edf60Kevin Tang{
8034ee09551764b045fdc02df754157473125edf60Kevin Tang   sizeof(GpsInterface),
8134ee09551764b045fdc02df754157473125edf60Kevin Tang   loc_init,
8234ee09551764b045fdc02df754157473125edf60Kevin Tang   loc_start,
8334ee09551764b045fdc02df754157473125edf60Kevin Tang   loc_stop,
8434ee09551764b045fdc02df754157473125edf60Kevin Tang   loc_cleanup,
8534ee09551764b045fdc02df754157473125edf60Kevin Tang   loc_inject_time,
8634ee09551764b045fdc02df754157473125edf60Kevin Tang   loc_inject_location,
8734ee09551764b045fdc02df754157473125edf60Kevin Tang   loc_delete_aiding_data,
8834ee09551764b045fdc02df754157473125edf60Kevin Tang   loc_set_position_mode,
8934ee09551764b045fdc02df754157473125edf60Kevin Tang   loc_get_extension
9034ee09551764b045fdc02df754157473125edf60Kevin Tang};
9134ee09551764b045fdc02df754157473125edf60Kevin Tang
9234ee09551764b045fdc02df754157473125edf60Kevin Tang// Function declarations for sLocEngAGpsInterface
9334ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void loc_agps_init(AGpsCallbacks* callbacks);
9434ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int  loc_agps_open(const char* apn);
9534ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int  loc_agps_closed();
9634ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int  loc_agps_open_failed();
9734ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int  loc_agps_set_server(AGpsType type, const char *hostname, int port);
980d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russostatic int  loc_agps_open_with_apniptype( const char* apn, ApnIpType apnIpType);
9934ee09551764b045fdc02df754157473125edf60Kevin Tang
1000d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russostatic const AGpsInterface sLocEngAGpsInterface =
10134ee09551764b045fdc02df754157473125edf60Kevin Tang{
1020d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo   sizeof(AGpsInterface),
10334ee09551764b045fdc02df754157473125edf60Kevin Tang   loc_agps_init,
10434ee09551764b045fdc02df754157473125edf60Kevin Tang   loc_agps_open,
10534ee09551764b045fdc02df754157473125edf60Kevin Tang   loc_agps_closed,
10634ee09551764b045fdc02df754157473125edf60Kevin Tang   loc_agps_open_failed,
1070d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo   loc_agps_set_server,
1080d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo   loc_agps_open_with_apniptype
10934ee09551764b045fdc02df754157473125edf60Kevin Tang};
11034ee09551764b045fdc02df754157473125edf60Kevin Tang
11134ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int loc_xtra_init(GpsXtraCallbacks* callbacks);
11234ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int loc_xtra_inject_data(char* data, int length);
11334ee09551764b045fdc02df754157473125edf60Kevin Tang
11434ee09551764b045fdc02df754157473125edf60Kevin Tangstatic const GpsXtraInterface sLocEngXTRAInterface =
11534ee09551764b045fdc02df754157473125edf60Kevin Tang{
11634ee09551764b045fdc02df754157473125edf60Kevin Tang    sizeof(GpsXtraInterface),
11734ee09551764b045fdc02df754157473125edf60Kevin Tang    loc_xtra_init,
11834ee09551764b045fdc02df754157473125edf60Kevin Tang    loc_xtra_inject_data
11934ee09551764b045fdc02df754157473125edf60Kevin Tang};
12034ee09551764b045fdc02df754157473125edf60Kevin Tang
12134ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void loc_ni_init(GpsNiCallbacks *callbacks);
12234ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void loc_ni_respond(int notif_id, GpsUserResponseType user_response);
12334ee09551764b045fdc02df754157473125edf60Kevin Tang
124fe660078f05f448ececb0b1170ecd79e600db440Kevin Tangstatic const GpsNiInterface sLocEngNiInterface =
12534ee09551764b045fdc02df754157473125edf60Kevin Tang{
12634ee09551764b045fdc02df754157473125edf60Kevin Tang   sizeof(GpsNiInterface),
12734ee09551764b045fdc02df754157473125edf60Kevin Tang   loc_ni_init,
12834ee09551764b045fdc02df754157473125edf60Kevin Tang   loc_ni_respond,
12934ee09551764b045fdc02df754157473125edf60Kevin Tang};
13034ee09551764b045fdc02df754157473125edf60Kevin Tang
1318aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastavastatic int loc_gps_measurement_init(GpsMeasurementCallbacks* callbacks);
1328aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastavastatic void loc_gps_measurement_close();
1338aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava
1348aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastavastatic const GpsMeasurementInterface sLocEngGpsMeasurementInterface =
1358aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava{
1368aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava    sizeof(GpsMeasurementInterface),
1378aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava    loc_gps_measurement_init,
1388aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava    loc_gps_measurement_close
1398aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava};
14047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo
14134ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void loc_agps_ril_init( AGpsRilCallbacks* callbacks );
14234ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void loc_agps_ril_set_ref_location(const AGpsRefLocation *agps_reflocation, size_t sz_struct);
14334ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void loc_agps_ril_set_set_id(AGpsSetIDType type, const char* setid);
14434ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void loc_agps_ril_ni_message(uint8_t *msg, size_t len);
14534ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void loc_agps_ril_update_network_state(int connected, int type, int roaming, const char* extra_info);
14634ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void loc_agps_ril_update_network_availability(int avaiable, const char* apn);
14734ee09551764b045fdc02df754157473125edf60Kevin Tang
14834ee09551764b045fdc02df754157473125edf60Kevin Tangstatic const AGpsRilInterface sLocEngAGpsRilInterface =
14934ee09551764b045fdc02df754157473125edf60Kevin Tang{
15034ee09551764b045fdc02df754157473125edf60Kevin Tang   sizeof(AGpsRilInterface),
15134ee09551764b045fdc02df754157473125edf60Kevin Tang   loc_agps_ril_init,
15234ee09551764b045fdc02df754157473125edf60Kevin Tang   loc_agps_ril_set_ref_location,
15334ee09551764b045fdc02df754157473125edf60Kevin Tang   loc_agps_ril_set_set_id,
15434ee09551764b045fdc02df754157473125edf60Kevin Tang   loc_agps_ril_ni_message,
15534ee09551764b045fdc02df754157473125edf60Kevin Tang   loc_agps_ril_update_network_state,
15634ee09551764b045fdc02df754157473125edf60Kevin Tang   loc_agps_ril_update_network_availability
15734ee09551764b045fdc02df754157473125edf60Kevin Tang};
15834ee09551764b045fdc02df754157473125edf60Kevin Tang
1591d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russostatic int loc_agps_install_certificates(const DerEncodedCertificate* certificates,
1601d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo                                         size_t length);
1611d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russostatic int loc_agps_revoke_certificates(const Sha1CertificateFingerprint* fingerprints,
1621d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo                                        size_t length);
1631d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo
1641d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russostatic const SuplCertificateInterface sLocEngAGpsCertInterface =
1651d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo{
1661d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo    sizeof(SuplCertificateInterface),
1671d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo    loc_agps_install_certificates,
1681d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo    loc_agps_revoke_certificates
1691d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo};
1701d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo
171fe660078f05f448ececb0b1170ecd79e600db440Kevin Tangstatic void loc_configuration_update(const char* config_data, int32_t length);
172fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang
173fe660078f05f448ececb0b1170ecd79e600db440Kevin Tangstatic const GnssConfigurationInterface sLocEngConfigInterface =
174fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang{
175fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang    sizeof(GnssConfigurationInterface),
176fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang    loc_configuration_update
177fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang};
178fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang
17934ee09551764b045fdc02df754157473125edf60Kevin Tangstatic loc_eng_data_s_type loc_afw_data;
18047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russostatic int gss_fd = -1;
1810c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastavastatic int sGnssType = GNSS_UNKNOWN;
18234ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
18334ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    gps_get_hardware_interface
18434ee09551764b045fdc02df754157473125edf60Kevin Tang
18534ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
18634ee09551764b045fdc02df754157473125edf60Kevin Tang   Returns the GPS hardware interaface based on LOC API
18734ee09551764b045fdc02df754157473125edf60Kevin Tang   if GPS is enabled.
18834ee09551764b045fdc02df754157473125edf60Kevin Tang
18934ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
19034ee09551764b045fdc02df754157473125edf60Kevin Tang   None
19134ee09551764b045fdc02df754157473125edf60Kevin Tang
19234ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
19334ee09551764b045fdc02df754157473125edf60Kevin Tang   0: success
19434ee09551764b045fdc02df754157473125edf60Kevin Tang
19534ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
19634ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
19734ee09551764b045fdc02df754157473125edf60Kevin Tang
19834ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
19934ee09551764b045fdc02df754157473125edf60Kevin Tangconst GpsInterface* gps_get_hardware_interface ()
20034ee09551764b045fdc02df754157473125edf60Kevin Tang{
20134ee09551764b045fdc02df754157473125edf60Kevin Tang    ENTRY_LOG_CALLFLOW();
20234ee09551764b045fdc02df754157473125edf60Kevin Tang    const GpsInterface* ret_val;
20334ee09551764b045fdc02df754157473125edf60Kevin Tang
20434ee09551764b045fdc02df754157473125edf60Kevin Tang    char propBuf[PROPERTY_VALUE_MAX];
20534ee09551764b045fdc02df754157473125edf60Kevin Tang
206e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    loc_eng_read_config();
207e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
20834ee09551764b045fdc02df754157473125edf60Kevin Tang    // check to see if GPS should be disabled
20934ee09551764b045fdc02df754157473125edf60Kevin Tang    property_get("gps.disable", propBuf, "");
21034ee09551764b045fdc02df754157473125edf60Kevin Tang    if (propBuf[0] == '1')
21134ee09551764b045fdc02df754157473125edf60Kevin Tang    {
21234ee09551764b045fdc02df754157473125edf60Kevin Tang        LOC_LOGD("gps_get_interface returning NULL because gps.disable=1\n");
21334ee09551764b045fdc02df754157473125edf60Kevin Tang        ret_val = NULL;
21434ee09551764b045fdc02df754157473125edf60Kevin Tang    } else {
21534ee09551764b045fdc02df754157473125edf60Kevin Tang        ret_val = &sLocEngInterface;
21634ee09551764b045fdc02df754157473125edf60Kevin Tang    }
21734ee09551764b045fdc02df754157473125edf60Kevin Tang
218e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    loc_eng_read_config();
219e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
22034ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%p, ret_val);
22134ee09551764b045fdc02df754157473125edf60Kevin Tang    return ret_val;
22234ee09551764b045fdc02df754157473125edf60Kevin Tang}
22334ee09551764b045fdc02df754157473125edf60Kevin Tang
22434ee09551764b045fdc02df754157473125edf60Kevin Tang// for gps.c
22534ee09551764b045fdc02df754157473125edf60Kevin Tangextern "C" const GpsInterface* get_gps_interface()
22634ee09551764b045fdc02df754157473125edf60Kevin Tang{
227e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    unsigned int target = TARGET_DEFAULT;
228e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    loc_eng_read_config();
229e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
23047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    target = loc_get_target();
231e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    LOC_LOGD("Target name check returned %s", loc_get_target_name(target));
23247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo
2330c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava    sGnssType = getTargetGnssType(target);
2340c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava    switch (sGnssType)
23547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    {
23647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    case GNSS_GSS:
237bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    case GNSS_AUTO:
238e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        //APQ8064
239c65fed03538cb5e4a5b62d3ca114ff3cc5e87e60Mekala Natarajan        gps_conf.CAPABILITIES &= ~(GPS_CAPABILITY_MSA | GPS_CAPABILITY_MSB);
240c65fed03538cb5e4a5b62d3ca114ff3cc5e87e60Mekala Natarajan        gss_fd = open("/dev/gss", O_RDONLY);
241c65fed03538cb5e4a5b62d3ca114ff3cc5e87e60Mekala Natarajan        if (gss_fd < 0) {
242c65fed03538cb5e4a5b62d3ca114ff3cc5e87e60Mekala Natarajan            LOC_LOGE("GSS open failed: %s\n", strerror(errno));
243c65fed03538cb5e4a5b62d3ca114ff3cc5e87e60Mekala Natarajan        }
244e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        else {
245e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            LOC_LOGD("GSS open success! CAPABILITIES %0lx\n",
246e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                     gps_conf.CAPABILITIES);
247e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        }
24847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        break;
24947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    case GNSS_NONE:
25047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        //MPQ8064
25147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        LOC_LOGE("No GPS HW on this target. Not returning interface.");
252e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        return NULL;
25347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    case GNSS_QCA1530:
25447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        // qca1530 chip is present
25547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        gps_conf.CAPABILITIES &= ~(GPS_CAPABILITY_MSA | GPS_CAPABILITY_MSB);
25647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        LOC_LOGD("qca1530 present: CAPABILITIES %0lx\n", gps_conf.CAPABILITIES);
25747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        break;
258c65fed03538cb5e4a5b62d3ca114ff3cc5e87e60Mekala Natarajan    }
25934ee09551764b045fdc02df754157473125edf60Kevin Tang    return &sLocEngInterface;
26034ee09551764b045fdc02df754157473125edf60Kevin Tang}
261e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
26234ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
26334ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_init
26434ee09551764b045fdc02df754157473125edf60Kevin Tang
26534ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
26634ee09551764b045fdc02df754157473125edf60Kevin Tang   Initialize the location engine, this include setting up global datas
26734ee09551764b045fdc02df754157473125edf60Kevin Tang   and registers location engien with loc api service.
26834ee09551764b045fdc02df754157473125edf60Kevin Tang
26934ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
27034ee09551764b045fdc02df754157473125edf60Kevin Tang   None
27134ee09551764b045fdc02df754157473125edf60Kevin Tang
27234ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
27334ee09551764b045fdc02df754157473125edf60Kevin Tang   0: success
27434ee09551764b045fdc02df754157473125edf60Kevin Tang
27534ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
27634ee09551764b045fdc02df754157473125edf60Kevin Tang   N/Ax
27734ee09551764b045fdc02df754157473125edf60Kevin Tang
27834ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
27934ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int loc_init(GpsCallbacks* callbacks)
28034ee09551764b045fdc02df754157473125edf60Kevin Tang{
281e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    int retVal = -1;
28234ee09551764b045fdc02df754157473125edf60Kevin Tang    ENTRY_LOG();
283e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    LOC_API_ADAPTER_EVENT_MASK_T event;
284e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
285e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    if (NULL == callbacks) {
286e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        LOC_LOGE("loc_init failed. cb = NULL\n");
287e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        EXIT_LOG(%d, retVal);
288e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        return retVal;
289e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
290e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
291e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    event = LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT |
292e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            LOC_API_ADAPTER_BIT_SATELLITE_REPORT |
293e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST |
294e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            LOC_API_ADAPTER_BIT_ASSISTANCE_DATA_REQUEST |
295e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            LOC_API_ADAPTER_BIT_IOCTL_REPORT |
296e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            LOC_API_ADAPTER_BIT_STATUS_REPORT |
297e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT |
298e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            LOC_API_ADAPTER_BIT_NI_NOTIFY_VERIFY_REQUEST;
299e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
300e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    LocCallbacks clientCallbacks = {local_loc_cb, /* location_cb */
30134ee09551764b045fdc02df754157473125edf60Kevin Tang                                    callbacks->status_cb, /* status_cb */
302e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                    local_sv_cb, /* sv_status_cb */
30334ee09551764b045fdc02df754157473125edf60Kevin Tang                                    callbacks->nmea_cb, /* nmea_cb */
30434ee09551764b045fdc02df754157473125edf60Kevin Tang                                    callbacks->set_capabilities_cb, /* set_capabilities_cb */
30534ee09551764b045fdc02df754157473125edf60Kevin Tang                                    callbacks->acquire_wakelock_cb, /* acquire_wakelock_cb */
30634ee09551764b045fdc02df754157473125edf60Kevin Tang                                    callbacks->release_wakelock_cb, /* release_wakelock_cb */
30734ee09551764b045fdc02df754157473125edf60Kevin Tang                                    callbacks->create_thread_cb, /* create_thread_cb */
30834ee09551764b045fdc02df754157473125edf60Kevin Tang                                    NULL, /* location_ext_parser */
309e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                    NULL, /* sv_ext_parser */
31047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo                                    callbacks->request_utc_time_cb, /* request_utc_time_cb */
3110c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava                                    };
312e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
31334ee09551764b045fdc02df754157473125edf60Kevin Tang    gps_loc_cb = callbacks->location_cb;
31434ee09551764b045fdc02df754157473125edf60Kevin Tang    gps_sv_cb = callbacks->sv_status_cb;
31534ee09551764b045fdc02df754157473125edf60Kevin Tang
31647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    retVal = loc_eng_init(loc_afw_data, &clientCallbacks, event, NULL);
31747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    loc_afw_data.adapter->mSupportsAgpsRequests = !loc_afw_data.adapter->hasAgpsExtendedCapabilities();
31847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    loc_afw_data.adapter->mSupportsPositionInjection = !loc_afw_data.adapter->hasCPIExtendedCapabilities();
319bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_afw_data.adapter->mSupportsTimeInjection = !loc_afw_data.adapter->hasCPIExtendedCapabilities();
320b2c66a082ebe2a2f887783810d4fb3a31fd547cdKevin Tang    loc_afw_data.adapter->setGpsLockMsg(0);
321bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    loc_afw_data.adapter->requestUlp(getCarrierCapabilities());
32247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo
32347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    if(retVal) {
32447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        LOC_LOGE("loc_eng_init() fail!");
32547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo        goto err;
32647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    }
32734ee09551764b045fdc02df754157473125edf60Kevin Tang
32847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    loc_afw_data.adapter->setPowerVoteRight(loc_get_target() == TARGET_QCA1530);
32947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    loc_afw_data.adapter->setPowerVote(true);
33047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo
33147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    LOC_LOGD("loc_eng_init() success!");
33287543bf77178d77edc23ed0043b76c0eb6ec3eccDante Russo
33347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russoerr:
334e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    EXIT_LOG(%d, retVal);
335e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    return retVal;
33634ee09551764b045fdc02df754157473125edf60Kevin Tang}
33734ee09551764b045fdc02df754157473125edf60Kevin Tang
33834ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
33934ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_cleanup
34034ee09551764b045fdc02df754157473125edf60Kevin Tang
34134ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
34234ee09551764b045fdc02df754157473125edf60Kevin Tang   Cleans location engine. The location client handle will be released.
34334ee09551764b045fdc02df754157473125edf60Kevin Tang
34434ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
34534ee09551764b045fdc02df754157473125edf60Kevin Tang   None
34634ee09551764b045fdc02df754157473125edf60Kevin Tang
34734ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
34834ee09551764b045fdc02df754157473125edf60Kevin Tang   None
34934ee09551764b045fdc02df754157473125edf60Kevin Tang
35034ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
35134ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
35234ee09551764b045fdc02df754157473125edf60Kevin Tang
35334ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
35434ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void loc_cleanup()
35534ee09551764b045fdc02df754157473125edf60Kevin Tang{
35634ee09551764b045fdc02df754157473125edf60Kevin Tang    ENTRY_LOG();
35747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo
35847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    loc_afw_data.adapter->setPowerVote(false);
359b2c66a082ebe2a2f887783810d4fb3a31fd547cdKevin Tang    loc_afw_data.adapter->setGpsLockMsg(gps_conf.GPS_LOCK);
36047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo
36134ee09551764b045fdc02df754157473125edf60Kevin Tang    loc_eng_cleanup(loc_afw_data);
36234ee09551764b045fdc02df754157473125edf60Kevin Tang    gps_loc_cb = NULL;
36334ee09551764b045fdc02df754157473125edf60Kevin Tang    gps_sv_cb = NULL;
364e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
36534ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%s, VOID_RET);
36634ee09551764b045fdc02df754157473125edf60Kevin Tang}
36734ee09551764b045fdc02df754157473125edf60Kevin Tang
36834ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
36934ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_start
37034ee09551764b045fdc02df754157473125edf60Kevin Tang
37134ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
37234ee09551764b045fdc02df754157473125edf60Kevin Tang   Starts the tracking session
37334ee09551764b045fdc02df754157473125edf60Kevin Tang
37434ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
37534ee09551764b045fdc02df754157473125edf60Kevin Tang   None
37634ee09551764b045fdc02df754157473125edf60Kevin Tang
37734ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
37834ee09551764b045fdc02df754157473125edf60Kevin Tang   0: success
37934ee09551764b045fdc02df754157473125edf60Kevin Tang
38034ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
38134ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
38234ee09551764b045fdc02df754157473125edf60Kevin Tang
38334ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
38434ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int loc_start()
38534ee09551764b045fdc02df754157473125edf60Kevin Tang{
38634ee09551764b045fdc02df754157473125edf60Kevin Tang    ENTRY_LOG();
38734ee09551764b045fdc02df754157473125edf60Kevin Tang    int ret_val = loc_eng_start(loc_afw_data);
38834ee09551764b045fdc02df754157473125edf60Kevin Tang
38934ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%d, ret_val);
39034ee09551764b045fdc02df754157473125edf60Kevin Tang    return ret_val;
39134ee09551764b045fdc02df754157473125edf60Kevin Tang}
39234ee09551764b045fdc02df754157473125edf60Kevin Tang
39334ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
39434ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_stop
39534ee09551764b045fdc02df754157473125edf60Kevin Tang
39634ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
39734ee09551764b045fdc02df754157473125edf60Kevin Tang   Stops the tracking session
39834ee09551764b045fdc02df754157473125edf60Kevin Tang
39934ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
40034ee09551764b045fdc02df754157473125edf60Kevin Tang   None
40134ee09551764b045fdc02df754157473125edf60Kevin Tang
40234ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
40334ee09551764b045fdc02df754157473125edf60Kevin Tang   0: success
40434ee09551764b045fdc02df754157473125edf60Kevin Tang
40534ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
40634ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
40734ee09551764b045fdc02df754157473125edf60Kevin Tang
40834ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
40934ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int loc_stop()
41034ee09551764b045fdc02df754157473125edf60Kevin Tang{
41134ee09551764b045fdc02df754157473125edf60Kevin Tang    ENTRY_LOG();
412e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    int ret_val = -1;
413e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    ret_val = loc_eng_stop(loc_afw_data);
41434ee09551764b045fdc02df754157473125edf60Kevin Tang
41534ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%d, ret_val);
41634ee09551764b045fdc02df754157473125edf60Kevin Tang    return ret_val;
41734ee09551764b045fdc02df754157473125edf60Kevin Tang}
41834ee09551764b045fdc02df754157473125edf60Kevin Tang
41934ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
42034ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_set_position_mode
42134ee09551764b045fdc02df754157473125edf60Kevin Tang
42234ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
42334ee09551764b045fdc02df754157473125edf60Kevin Tang   Sets the mode and fix frequency for the tracking session.
42434ee09551764b045fdc02df754157473125edf60Kevin Tang
42534ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
42634ee09551764b045fdc02df754157473125edf60Kevin Tang   None
42734ee09551764b045fdc02df754157473125edf60Kevin Tang
42834ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
42934ee09551764b045fdc02df754157473125edf60Kevin Tang   0: success
43034ee09551764b045fdc02df754157473125edf60Kevin Tang
43134ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
43234ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
43334ee09551764b045fdc02df754157473125edf60Kevin Tang
43434ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
43534ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int  loc_set_position_mode(GpsPositionMode mode,
43634ee09551764b045fdc02df754157473125edf60Kevin Tang                                  GpsPositionRecurrence recurrence,
43734ee09551764b045fdc02df754157473125edf60Kevin Tang                                  uint32_t min_interval,
43834ee09551764b045fdc02df754157473125edf60Kevin Tang                                  uint32_t preferred_accuracy,
43934ee09551764b045fdc02df754157473125edf60Kevin Tang                                  uint32_t preferred_time)
44034ee09551764b045fdc02df754157473125edf60Kevin Tang{
44134ee09551764b045fdc02df754157473125edf60Kevin Tang    ENTRY_LOG();
442e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    int ret_val = -1;
44334ee09551764b045fdc02df754157473125edf60Kevin Tang    LocPositionMode locMode;
44434ee09551764b045fdc02df754157473125edf60Kevin Tang    switch (mode) {
44534ee09551764b045fdc02df754157473125edf60Kevin Tang    case GPS_POSITION_MODE_MS_BASED:
44634ee09551764b045fdc02df754157473125edf60Kevin Tang        locMode = LOC_POSITION_MODE_MS_BASED;
44734ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
44834ee09551764b045fdc02df754157473125edf60Kevin Tang    case GPS_POSITION_MODE_MS_ASSISTED:
44934ee09551764b045fdc02df754157473125edf60Kevin Tang        locMode = LOC_POSITION_MODE_MS_ASSISTED;
45034ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
45134ee09551764b045fdc02df754157473125edf60Kevin Tang    default:
45234ee09551764b045fdc02df754157473125edf60Kevin Tang        locMode = LOC_POSITION_MODE_STANDALONE;
45334ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
45434ee09551764b045fdc02df754157473125edf60Kevin Tang    }
455e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
456e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    LocPosMode params(locMode, recurrence, min_interval,
457e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                      preferred_accuracy, preferred_time, NULL, NULL);
458e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    ret_val = loc_eng_set_position_mode(loc_afw_data, params);
45934ee09551764b045fdc02df754157473125edf60Kevin Tang
46034ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%d, ret_val);
46134ee09551764b045fdc02df754157473125edf60Kevin Tang    return ret_val;
46234ee09551764b045fdc02df754157473125edf60Kevin Tang}
46334ee09551764b045fdc02df754157473125edf60Kevin Tang
46434ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
46534ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_inject_time
46634ee09551764b045fdc02df754157473125edf60Kevin Tang
46734ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
46834ee09551764b045fdc02df754157473125edf60Kevin Tang   This is used by Java native function to do time injection.
46934ee09551764b045fdc02df754157473125edf60Kevin Tang
47034ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
47134ee09551764b045fdc02df754157473125edf60Kevin Tang   None
47234ee09551764b045fdc02df754157473125edf60Kevin Tang
47334ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
47434ee09551764b045fdc02df754157473125edf60Kevin Tang   0
47534ee09551764b045fdc02df754157473125edf60Kevin Tang
47634ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
47734ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
47834ee09551764b045fdc02df754157473125edf60Kevin Tang
47934ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
48034ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int loc_inject_time(GpsUtcTime time, int64_t timeReference, int uncertainty)
48134ee09551764b045fdc02df754157473125edf60Kevin Tang{
48234ee09551764b045fdc02df754157473125edf60Kevin Tang    ENTRY_LOG();
483e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    int ret_val = 0;
484e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
485e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    ret_val = loc_eng_inject_time(loc_afw_data, time,
486e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo                                  timeReference, uncertainty);
48734ee09551764b045fdc02df754157473125edf60Kevin Tang
48834ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%d, ret_val);
48934ee09551764b045fdc02df754157473125edf60Kevin Tang    return ret_val;
49034ee09551764b045fdc02df754157473125edf60Kevin Tang}
49134ee09551764b045fdc02df754157473125edf60Kevin Tang
49234ee09551764b045fdc02df754157473125edf60Kevin Tang
49334ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
49434ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_inject_location
49534ee09551764b045fdc02df754157473125edf60Kevin Tang
49634ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
49734ee09551764b045fdc02df754157473125edf60Kevin Tang   This is used by Java native function to do location injection.
49834ee09551764b045fdc02df754157473125edf60Kevin Tang
49934ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
50034ee09551764b045fdc02df754157473125edf60Kevin Tang   None
50134ee09551764b045fdc02df754157473125edf60Kevin Tang
50234ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
50334ee09551764b045fdc02df754157473125edf60Kevin Tang   0          : Successful
50434ee09551764b045fdc02df754157473125edf60Kevin Tang   error code : Failure
50534ee09551764b045fdc02df754157473125edf60Kevin Tang
50634ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
50734ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
50834ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
50934ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int loc_inject_location(double latitude, double longitude, float accuracy)
51034ee09551764b045fdc02df754157473125edf60Kevin Tang{
51134ee09551764b045fdc02df754157473125edf60Kevin Tang    ENTRY_LOG();
51234ee09551764b045fdc02df754157473125edf60Kevin Tang
51347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    int ret_val = 0;
51447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo    ret_val = loc_eng_inject_location(loc_afw_data, latitude, longitude, accuracy);
51547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo
51634ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%d, ret_val);
51734ee09551764b045fdc02df754157473125edf60Kevin Tang    return ret_val;
51834ee09551764b045fdc02df754157473125edf60Kevin Tang}
51934ee09551764b045fdc02df754157473125edf60Kevin Tang
52034ee09551764b045fdc02df754157473125edf60Kevin Tang
52134ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
52234ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_delete_aiding_data
52334ee09551764b045fdc02df754157473125edf60Kevin Tang
52434ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
52534ee09551764b045fdc02df754157473125edf60Kevin Tang   This is used by Java native function to delete the aiding data. The function
52634ee09551764b045fdc02df754157473125edf60Kevin Tang   updates the global variable for the aiding data to be deleted. If the GPS
52734ee09551764b045fdc02df754157473125edf60Kevin Tang   engine is off, the aiding data will be deleted. Otherwise, the actual action
52834ee09551764b045fdc02df754157473125edf60Kevin Tang   will happen when gps engine is turned off.
52934ee09551764b045fdc02df754157473125edf60Kevin Tang
53034ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
53134ee09551764b045fdc02df754157473125edf60Kevin Tang   Assumes the aiding data type specified in GpsAidingData matches with
53234ee09551764b045fdc02df754157473125edf60Kevin Tang   LOC API specification.
53334ee09551764b045fdc02df754157473125edf60Kevin Tang
53434ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
53534ee09551764b045fdc02df754157473125edf60Kevin Tang   None
53634ee09551764b045fdc02df754157473125edf60Kevin Tang
53734ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
53834ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
53934ee09551764b045fdc02df754157473125edf60Kevin Tang
54034ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
54134ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void loc_delete_aiding_data(GpsAidingData f)
54234ee09551764b045fdc02df754157473125edf60Kevin Tang{
54334ee09551764b045fdc02df754157473125edf60Kevin Tang    ENTRY_LOG();
54434ee09551764b045fdc02df754157473125edf60Kevin Tang    loc_eng_delete_aiding_data(loc_afw_data, f);
54534ee09551764b045fdc02df754157473125edf60Kevin Tang
54634ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%s, VOID_RET);
54734ee09551764b045fdc02df754157473125edf60Kevin Tang}
54834ee09551764b045fdc02df754157473125edf60Kevin Tang
54923d1e163c382baf6f395af46b34d309db0cb5c29Dante Russoconst GpsGeofencingInterface* get_geofence_interface(void)
55023d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo{
55123d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo    ENTRY_LOG();
55223d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo    void *handle;
55323d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo    const char *error;
55423d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo    typedef const GpsGeofencingInterface* (*get_gps_geofence_interface_function) (void);
55523d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo    get_gps_geofence_interface_function get_gps_geofence_interface;
55623d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo    static const GpsGeofencingInterface* geofence_interface = NULL;
55723d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo
55823d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo    dlerror();    /* Clear any existing error */
55923d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo
56023d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo    handle = dlopen ("libgeofence.so", RTLD_NOW);
56123d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo
56223d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo    if (!handle)
56323d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo    {
56423d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo        if ((error = dlerror()) != NULL)  {
56523d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo            LOC_LOGE ("%s, dlopen for libgeofence.so failed, error = %s\n", __func__, error);
56623d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo           }
56723d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo        goto exit;
56823d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo    }
56923d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo    dlerror();    /* Clear any existing error */
57023d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo    get_gps_geofence_interface = (get_gps_geofence_interface_function)dlsym(handle, "gps_geofence_get_interface");
571bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if ((error = dlerror()) != NULL && NULL != get_gps_geofence_interface)  {
572e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        LOC_LOGE ("%s, dlsym for get_gps_geofence_interface failed, error = %s\n", __func__, error);
57323d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo        goto exit;
57423d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo     }
57523d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo
57623d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo    geofence_interface = get_gps_geofence_interface();
57723d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo
57823d1e163c382baf6f395af46b34d309db0cb5c29Dante Russoexit:
57923d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo    EXIT_LOG(%d, geofence_interface == NULL);
58023d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo    return geofence_interface;
58123d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo}
58234ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
58334ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_get_extension
58434ee09551764b045fdc02df754157473125edf60Kevin Tang
58534ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
58634ee09551764b045fdc02df754157473125edf60Kevin Tang   Get the gps extension to support XTRA.
58734ee09551764b045fdc02df754157473125edf60Kevin Tang
58834ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
58934ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
59034ee09551764b045fdc02df754157473125edf60Kevin Tang
59134ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
59234ee09551764b045fdc02df754157473125edf60Kevin Tang   The GPS extension interface.
59334ee09551764b045fdc02df754157473125edf60Kevin Tang
59434ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
59534ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
59634ee09551764b045fdc02df754157473125edf60Kevin Tang
59734ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
598e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoconst void* loc_get_extension(const char* name)
59934ee09551764b045fdc02df754157473125edf60Kevin Tang{
60034ee09551764b045fdc02df754157473125edf60Kevin Tang    ENTRY_LOG();
60134ee09551764b045fdc02df754157473125edf60Kevin Tang    const void* ret_val = NULL;
60234ee09551764b045fdc02df754157473125edf60Kevin Tang
603e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo   LOC_LOGD("%s:%d] For Interface = %s\n",__func__, __LINE__, name);
60434ee09551764b045fdc02df754157473125edf60Kevin Tang   if (strcmp(name, GPS_XTRA_INTERFACE) == 0)
60534ee09551764b045fdc02df754157473125edf60Kevin Tang   {
606e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo       ret_val = &sLocEngXTRAInterface;
60734ee09551764b045fdc02df754157473125edf60Kevin Tang   }
60834ee09551764b045fdc02df754157473125edf60Kevin Tang   else if (strcmp(name, AGPS_INTERFACE) == 0)
60934ee09551764b045fdc02df754157473125edf60Kevin Tang   {
61047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo       ret_val = &sLocEngAGpsInterface;
61134ee09551764b045fdc02df754157473125edf60Kevin Tang   }
61234ee09551764b045fdc02df754157473125edf60Kevin Tang   else if (strcmp(name, GPS_NI_INTERFACE) == 0)
61334ee09551764b045fdc02df754157473125edf60Kevin Tang   {
614e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo       ret_val = &sLocEngNiInterface;
61534ee09551764b045fdc02df754157473125edf60Kevin Tang   }
61634ee09551764b045fdc02df754157473125edf60Kevin Tang   else if (strcmp(name, AGPS_RIL_INTERFACE) == 0)
61734ee09551764b045fdc02df754157473125edf60Kevin Tang   {
6182863c4092108a764d8537b453e66357939e19062Kevin Tang       ret_val = &sLocEngAGpsRilInterface;
61934ee09551764b045fdc02df754157473125edf60Kevin Tang   }
62023d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo   else if (strcmp(name, GPS_GEOFENCING_INTERFACE) == 0)
62123d1e163c382baf6f395af46b34d309db0cb5c29Dante Russo   {
622e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo       if ((gps_conf.CAPABILITIES | GPS_CAPABILITY_GEOFENCING) == gps_conf.CAPABILITIES ){
623e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo           ret_val = get_geofence_interface();
624e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo       }
62534ee09551764b045fdc02df754157473125edf60Kevin Tang   }
6261d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo   else if (strcmp(name, SUPL_CERTIFICATE_INTERFACE) == 0)
6271d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo   {
6281d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo       ret_val = &sLocEngAGpsCertInterface;
6291d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo   }
630fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang   else if (strcmp(name, GNSS_CONFIGURATION_INTERFACE) == 0)
631fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang   {
632fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang       ret_val = &sLocEngConfigInterface;
633fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang   }
6348aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava   else if (strcmp(name, GPS_MEASUREMENT_INTERFACE) == 0)
6358aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava   {
6368aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava       ret_val = &sLocEngGpsMeasurementInterface;
6378aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava   }
63834ee09551764b045fdc02df754157473125edf60Kevin Tang   else
63934ee09551764b045fdc02df754157473125edf60Kevin Tang   {
64034ee09551764b045fdc02df754157473125edf60Kevin Tang      LOC_LOGE ("get_extension: Invalid interface passed in\n");
64134ee09551764b045fdc02df754157473125edf60Kevin Tang   }
64234ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%p, ret_val);
64334ee09551764b045fdc02df754157473125edf60Kevin Tang    return ret_val;
64434ee09551764b045fdc02df754157473125edf60Kevin Tang}
64534ee09551764b045fdc02df754157473125edf60Kevin Tang
64634ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
64734ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_agps_init
64834ee09551764b045fdc02df754157473125edf60Kevin Tang
64934ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
65034ee09551764b045fdc02df754157473125edf60Kevin Tang   Initialize the AGps interface.
65134ee09551764b045fdc02df754157473125edf60Kevin Tang
65234ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
65334ee09551764b045fdc02df754157473125edf60Kevin Tang   NONE
65434ee09551764b045fdc02df754157473125edf60Kevin Tang
65534ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
65634ee09551764b045fdc02df754157473125edf60Kevin Tang   0
65734ee09551764b045fdc02df754157473125edf60Kevin Tang
65834ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
65934ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
66034ee09551764b045fdc02df754157473125edf60Kevin Tang
66134ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
66234ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void loc_agps_init(AGpsCallbacks* callbacks)
66334ee09551764b045fdc02df754157473125edf60Kevin Tang{
66434ee09551764b045fdc02df754157473125edf60Kevin Tang    ENTRY_LOG();
665e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    loc_eng_agps_init(loc_afw_data, (AGpsExtCallbacks*)callbacks);
66634ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%s, VOID_RET);
66734ee09551764b045fdc02df754157473125edf60Kevin Tang}
66834ee09551764b045fdc02df754157473125edf60Kevin Tang
66934ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
67034ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_agps_open
67134ee09551764b045fdc02df754157473125edf60Kevin Tang
67234ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
67334ee09551764b045fdc02df754157473125edf60Kevin Tang   This function is called when on-demand data connection opening is successful.
67434ee09551764b045fdc02df754157473125edf60Kevin TangIt should inform ARM 9 about the data open result.
67534ee09551764b045fdc02df754157473125edf60Kevin Tang
67634ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
67734ee09551764b045fdc02df754157473125edf60Kevin Tang   NONE
67834ee09551764b045fdc02df754157473125edf60Kevin Tang
67934ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
68034ee09551764b045fdc02df754157473125edf60Kevin Tang   0
68134ee09551764b045fdc02df754157473125edf60Kevin Tang
68234ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
68334ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
68434ee09551764b045fdc02df754157473125edf60Kevin Tang
68534ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
68634ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int loc_agps_open(const char* apn)
68734ee09551764b045fdc02df754157473125edf60Kevin Tang{
68834ee09551764b045fdc02df754157473125edf60Kevin Tang    ENTRY_LOG();
689e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    AGpsType agpsType = AGPS_TYPE_SUPL;
690e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    AGpsBearerType bearerType = AGPS_APN_BEARER_IPV4;
691e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    int ret_val = loc_eng_agps_open(loc_afw_data, agpsType, apn, bearerType);
69234ee09551764b045fdc02df754157473125edf60Kevin Tang
69334ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%d, ret_val);
69434ee09551764b045fdc02df754157473125edf60Kevin Tang    return ret_val;
69534ee09551764b045fdc02df754157473125edf60Kevin Tang}
69634ee09551764b045fdc02df754157473125edf60Kevin Tang
69734ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
6980d00b9e0690547ad06eef43a5f1c77a31e8885dcDante RussoFUNCTION    loc_agps_open_with_apniptype
6990d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo
7000d00b9e0690547ad06eef43a5f1c77a31e8885dcDante RussoDESCRIPTION
7010d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo   This function is called when on-demand data connection opening is successful.
7020d00b9e0690547ad06eef43a5f1c77a31e8885dcDante RussoIt should inform ARM 9 about the data open result.
7030d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo
7040d00b9e0690547ad06eef43a5f1c77a31e8885dcDante RussoDEPENDENCIES
7050d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo   NONE
7060d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo
7070d00b9e0690547ad06eef43a5f1c77a31e8885dcDante RussoRETURN VALUE
7080d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo   0
7090d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo
7100d00b9e0690547ad06eef43a5f1c77a31e8885dcDante RussoSIDE EFFECTS
7110d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo   N/A
7120d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo
7130d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo===========================================================================*/
7140d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russostatic int  loc_agps_open_with_apniptype(const char* apn, ApnIpType apnIpType)
7150d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo{
7160d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo    ENTRY_LOG();
7170d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo    AGpsType agpsType = AGPS_TYPE_SUPL;
7180d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo    AGpsBearerType bearerType;
7190d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo
7200d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo    switch (apnIpType) {
7210d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo        case APN_IP_IPV4:
7220d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo            bearerType = AGPS_APN_BEARER_IPV4;
7230d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo            break;
7240d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo        case APN_IP_IPV6:
7250d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo            bearerType = AGPS_APN_BEARER_IPV6;
7260d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo            break;
7270d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo        case APN_IP_IPV4V6:
7280d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo            bearerType = AGPS_APN_BEARER_IPV4V6;
7290d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo            break;
7300d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo        default:
731d7b1204cc565f482a6067953cebe25b16cc2a148Dante Russo            bearerType = AGPS_APN_BEARER_IPV4;
7320d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo            break;
7330d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo    }
7340d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo
7350d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo    int ret_val = loc_eng_agps_open(loc_afw_data, agpsType, apn, bearerType);
7360d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo
7370d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo    EXIT_LOG(%d, ret_val);
7380d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo    return ret_val;
7390d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo}
7400d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo
7410d00b9e0690547ad06eef43a5f1c77a31e8885dcDante Russo/*===========================================================================
74234ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_agps_closed
74334ee09551764b045fdc02df754157473125edf60Kevin Tang
74434ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
74534ee09551764b045fdc02df754157473125edf60Kevin Tang   This function is called when on-demand data connection closing is done.
74634ee09551764b045fdc02df754157473125edf60Kevin TangIt should inform ARM 9 about the data close result.
74734ee09551764b045fdc02df754157473125edf60Kevin Tang
74834ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
74934ee09551764b045fdc02df754157473125edf60Kevin Tang   NONE
75034ee09551764b045fdc02df754157473125edf60Kevin Tang
75134ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
75234ee09551764b045fdc02df754157473125edf60Kevin Tang   0
75334ee09551764b045fdc02df754157473125edf60Kevin Tang
75434ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
75534ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
75634ee09551764b045fdc02df754157473125edf60Kevin Tang
75734ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
75834ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int loc_agps_closed()
75934ee09551764b045fdc02df754157473125edf60Kevin Tang{
76034ee09551764b045fdc02df754157473125edf60Kevin Tang    ENTRY_LOG();
761e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    AGpsType agpsType = AGPS_TYPE_SUPL;
762e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    int ret_val = loc_eng_agps_closed(loc_afw_data, agpsType);
76334ee09551764b045fdc02df754157473125edf60Kevin Tang
76434ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%d, ret_val);
76534ee09551764b045fdc02df754157473125edf60Kevin Tang    return ret_val;
76634ee09551764b045fdc02df754157473125edf60Kevin Tang}
76734ee09551764b045fdc02df754157473125edf60Kevin Tang
76834ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
76934ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_agps_open_failed
77034ee09551764b045fdc02df754157473125edf60Kevin Tang
77134ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
77234ee09551764b045fdc02df754157473125edf60Kevin Tang   This function is called when on-demand data connection opening has failed.
77334ee09551764b045fdc02df754157473125edf60Kevin TangIt should inform ARM 9 about the data open result.
77434ee09551764b045fdc02df754157473125edf60Kevin Tang
77534ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
77634ee09551764b045fdc02df754157473125edf60Kevin Tang   NONE
77734ee09551764b045fdc02df754157473125edf60Kevin Tang
77834ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
77934ee09551764b045fdc02df754157473125edf60Kevin Tang   0
78034ee09551764b045fdc02df754157473125edf60Kevin Tang
78134ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
78234ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
78334ee09551764b045fdc02df754157473125edf60Kevin Tang
78434ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
78534ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_agps_open_failed()
78634ee09551764b045fdc02df754157473125edf60Kevin Tang{
78734ee09551764b045fdc02df754157473125edf60Kevin Tang    ENTRY_LOG();
788e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    AGpsType agpsType = AGPS_TYPE_SUPL;
789e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    int ret_val = loc_eng_agps_open_failed(loc_afw_data, agpsType);
79034ee09551764b045fdc02df754157473125edf60Kevin Tang
79134ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%d, ret_val);
79234ee09551764b045fdc02df754157473125edf60Kevin Tang    return ret_val;
79334ee09551764b045fdc02df754157473125edf60Kevin Tang}
79434ee09551764b045fdc02df754157473125edf60Kevin Tang
79534ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
79634ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_agps_set_server
79734ee09551764b045fdc02df754157473125edf60Kevin Tang
79834ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
79934ee09551764b045fdc02df754157473125edf60Kevin Tang   If loc_eng_set_server is called before loc_eng_init, it doesn't work. This
80034ee09551764b045fdc02df754157473125edf60Kevin Tang   proxy buffers server settings and calls loc_eng_set_server when the client is
80134ee09551764b045fdc02df754157473125edf60Kevin Tang   open.
80234ee09551764b045fdc02df754157473125edf60Kevin Tang
80334ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
80434ee09551764b045fdc02df754157473125edf60Kevin Tang   NONE
80534ee09551764b045fdc02df754157473125edf60Kevin Tang
80634ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
80734ee09551764b045fdc02df754157473125edf60Kevin Tang   0
80834ee09551764b045fdc02df754157473125edf60Kevin Tang
80934ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
81034ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
81134ee09551764b045fdc02df754157473125edf60Kevin Tang
81234ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
81334ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int loc_agps_set_server(AGpsType type, const char* hostname, int port)
81434ee09551764b045fdc02df754157473125edf60Kevin Tang{
81534ee09551764b045fdc02df754157473125edf60Kevin Tang    ENTRY_LOG();
81634ee09551764b045fdc02df754157473125edf60Kevin Tang    LocServerType serverType;
81734ee09551764b045fdc02df754157473125edf60Kevin Tang    switch (type) {
81834ee09551764b045fdc02df754157473125edf60Kevin Tang    case AGPS_TYPE_SUPL:
81934ee09551764b045fdc02df754157473125edf60Kevin Tang        serverType = LOC_AGPS_SUPL_SERVER;
82034ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
82134ee09551764b045fdc02df754157473125edf60Kevin Tang    case AGPS_TYPE_C2K:
82234ee09551764b045fdc02df754157473125edf60Kevin Tang        serverType = LOC_AGPS_CDMA_PDE_SERVER;
82334ee09551764b045fdc02df754157473125edf60Kevin Tang        break;
824e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    default:
825e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        serverType = LOC_AGPS_SUPL_SERVER;
82634ee09551764b045fdc02df754157473125edf60Kevin Tang    }
82734ee09551764b045fdc02df754157473125edf60Kevin Tang    int ret_val = loc_eng_set_server_proxy(loc_afw_data, serverType, hostname, port);
82834ee09551764b045fdc02df754157473125edf60Kevin Tang
82934ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%d, ret_val);
83034ee09551764b045fdc02df754157473125edf60Kevin Tang    return ret_val;
83134ee09551764b045fdc02df754157473125edf60Kevin Tang}
83234ee09551764b045fdc02df754157473125edf60Kevin Tang
83334ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
834e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoFUNCTIONf571
835e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    loc_xtra_init
83634ee09551764b045fdc02df754157473125edf60Kevin Tang
83734ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
83834ee09551764b045fdc02df754157473125edf60Kevin Tang   Initialize XTRA module.
83934ee09551764b045fdc02df754157473125edf60Kevin Tang
84034ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
84134ee09551764b045fdc02df754157473125edf60Kevin Tang   None
84234ee09551764b045fdc02df754157473125edf60Kevin Tang
84334ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
84434ee09551764b045fdc02df754157473125edf60Kevin Tang   0: success
84534ee09551764b045fdc02df754157473125edf60Kevin Tang
84634ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
84734ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
84834ee09551764b045fdc02df754157473125edf60Kevin Tang
84934ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
85034ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int loc_xtra_init(GpsXtraCallbacks* callbacks)
85134ee09551764b045fdc02df754157473125edf60Kevin Tang{
85234ee09551764b045fdc02df754157473125edf60Kevin Tang    ENTRY_LOG();
8530c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava    GpsXtraExtCallbacks extCallbacks;
8540c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava    memset(&extCallbacks, 0, sizeof(extCallbacks));
8550c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava    extCallbacks.download_request_cb = callbacks->download_request_cb;
8560c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava    int ret_val = loc_eng_xtra_init(loc_afw_data, &extCallbacks);
85734ee09551764b045fdc02df754157473125edf60Kevin Tang
85834ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%d, ret_val);
85934ee09551764b045fdc02df754157473125edf60Kevin Tang    return ret_val;
86034ee09551764b045fdc02df754157473125edf60Kevin Tang}
86134ee09551764b045fdc02df754157473125edf60Kevin Tang
86234ee09551764b045fdc02df754157473125edf60Kevin Tang
86334ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
86434ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_xtra_inject_data
86534ee09551764b045fdc02df754157473125edf60Kevin Tang
86634ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
86734ee09551764b045fdc02df754157473125edf60Kevin Tang   Initialize XTRA module.
86834ee09551764b045fdc02df754157473125edf60Kevin Tang
86934ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
87034ee09551764b045fdc02df754157473125edf60Kevin Tang   None
87134ee09551764b045fdc02df754157473125edf60Kevin Tang
87234ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
87334ee09551764b045fdc02df754157473125edf60Kevin Tang   0: success
87434ee09551764b045fdc02df754157473125edf60Kevin Tang
87534ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
87634ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
87734ee09551764b045fdc02df754157473125edf60Kevin Tang
87834ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
87934ee09551764b045fdc02df754157473125edf60Kevin Tangstatic int loc_xtra_inject_data(char* data, int length)
88034ee09551764b045fdc02df754157473125edf60Kevin Tang{
88134ee09551764b045fdc02df754157473125edf60Kevin Tang    ENTRY_LOG();
882bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int ret_val = -1;
883bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if( (data != NULL) && ((unsigned int)length <= XTRA_DATA_MAX_SIZE))
884bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        ret_val = loc_eng_xtra_inject_data(loc_afw_data, data, length);
885bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    else
886bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGE("%s, Could not inject XTRA data. Buffer address: %p, length: %d",
887bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo                 __func__, data, length);
88834ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%d, ret_val);
88934ee09551764b045fdc02df754157473125edf60Kevin Tang    return ret_val;
89034ee09551764b045fdc02df754157473125edf60Kevin Tang}
89134ee09551764b045fdc02df754157473125edf60Kevin Tang
89234ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
8938aac9d301fc5aa83071492803f4335b73f2604e3Vineeta SrivastavaFUNCTION    loc_gps_measurement_init
8948aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava
8958aac9d301fc5aa83071492803f4335b73f2604e3Vineeta SrivastavaDESCRIPTION
8968aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava   This function initializes the gps measurement interface
8978aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava
8988aac9d301fc5aa83071492803f4335b73f2604e3Vineeta SrivastavaDEPENDENCIES
8998aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava   NONE
9008aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava
9018aac9d301fc5aa83071492803f4335b73f2604e3Vineeta SrivastavaRETURN VALUE
9028aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava   None
9038aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava
9048aac9d301fc5aa83071492803f4335b73f2604e3Vineeta SrivastavaSIDE EFFECTS
9058aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava   N/A
9068aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava
9078aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava===========================================================================*/
9088aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastavastatic int loc_gps_measurement_init(GpsMeasurementCallbacks* callbacks)
9098aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava{
9108aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava    ENTRY_LOG();
9118aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava    int ret_val = loc_eng_gps_measurement_init(loc_afw_data,
9128aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava                                               callbacks);
9138aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava
9148aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava    EXIT_LOG(%d, ret_val);
9158aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava    return ret_val;
9168aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava}
9178aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava
9188aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava/*===========================================================================
9198aac9d301fc5aa83071492803f4335b73f2604e3Vineeta SrivastavaFUNCTION    loc_gps_measurement_close
9208aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava
9218aac9d301fc5aa83071492803f4335b73f2604e3Vineeta SrivastavaDESCRIPTION
9228aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava   This function closes the gps measurement interface
9238aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava
9248aac9d301fc5aa83071492803f4335b73f2604e3Vineeta SrivastavaDEPENDENCIES
9258aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava   NONE
9268aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava
9278aac9d301fc5aa83071492803f4335b73f2604e3Vineeta SrivastavaRETURN VALUE
9288aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava   None
9298aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava
9308aac9d301fc5aa83071492803f4335b73f2604e3Vineeta SrivastavaSIDE EFFECTS
9318aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava   N/A
9328aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava
9338aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava===========================================================================*/
9348aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastavastatic void loc_gps_measurement_close()
9358aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava{
9368aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava    ENTRY_LOG();
9378aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava    loc_eng_gps_measurement_close(loc_afw_data);
9388aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava
9398aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava    EXIT_LOG(%s, VOID_RET);
9408aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava}
9418aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava
9428aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava/*===========================================================================
94334ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_ni_init
94434ee09551764b045fdc02df754157473125edf60Kevin Tang
94534ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
94634ee09551764b045fdc02df754157473125edf60Kevin Tang   This function initializes the NI interface
94734ee09551764b045fdc02df754157473125edf60Kevin Tang
94834ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
94934ee09551764b045fdc02df754157473125edf60Kevin Tang   NONE
95034ee09551764b045fdc02df754157473125edf60Kevin Tang
95134ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
95234ee09551764b045fdc02df754157473125edf60Kevin Tang   None
95334ee09551764b045fdc02df754157473125edf60Kevin Tang
95434ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
95534ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
95634ee09551764b045fdc02df754157473125edf60Kevin Tang
95734ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
95834ee09551764b045fdc02df754157473125edf60Kevin Tangvoid loc_ni_init(GpsNiCallbacks *callbacks)
95934ee09551764b045fdc02df754157473125edf60Kevin Tang{
96034ee09551764b045fdc02df754157473125edf60Kevin Tang    ENTRY_LOG();
961e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    loc_eng_ni_init(loc_afw_data,(GpsNiExtCallbacks*) callbacks);
96234ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%s, VOID_RET);
96334ee09551764b045fdc02df754157473125edf60Kevin Tang}
96434ee09551764b045fdc02df754157473125edf60Kevin Tang
96534ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
96634ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_ni_respond
96734ee09551764b045fdc02df754157473125edf60Kevin Tang
96834ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
96934ee09551764b045fdc02df754157473125edf60Kevin Tang   This function sends an NI respond to the modem processor
97034ee09551764b045fdc02df754157473125edf60Kevin Tang
97134ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
97234ee09551764b045fdc02df754157473125edf60Kevin Tang   NONE
97334ee09551764b045fdc02df754157473125edf60Kevin Tang
97434ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
97534ee09551764b045fdc02df754157473125edf60Kevin Tang   None
97634ee09551764b045fdc02df754157473125edf60Kevin Tang
97734ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
97834ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
97934ee09551764b045fdc02df754157473125edf60Kevin Tang
98034ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
98134ee09551764b045fdc02df754157473125edf60Kevin Tangvoid loc_ni_respond(int notif_id, GpsUserResponseType user_response)
98234ee09551764b045fdc02df754157473125edf60Kevin Tang{
98334ee09551764b045fdc02df754157473125edf60Kevin Tang    ENTRY_LOG();
98434ee09551764b045fdc02df754157473125edf60Kevin Tang    loc_eng_ni_respond(loc_afw_data, notif_id, user_response);
98534ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%s, VOID_RET);
98634ee09551764b045fdc02df754157473125edf60Kevin Tang}
98734ee09551764b045fdc02df754157473125edf60Kevin Tang
9882863c4092108a764d8537b453e66357939e19062Kevin Tang// for XTRA
9892863c4092108a764d8537b453e66357939e19062Kevin Tangstatic inline int createSocket() {
9902863c4092108a764d8537b453e66357939e19062Kevin Tang    int socketFd = -1;
9912863c4092108a764d8537b453e66357939e19062Kevin Tang
9922863c4092108a764d8537b453e66357939e19062Kevin Tang    if ((socketFd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
9932863c4092108a764d8537b453e66357939e19062Kevin Tang        LOC_LOGe("create socket error. reason:%s", strerror(errno));
9942863c4092108a764d8537b453e66357939e19062Kevin Tang
9952863c4092108a764d8537b453e66357939e19062Kevin Tang     } else {
9962863c4092108a764d8537b453e66357939e19062Kevin Tang        const char* socketPath = "/data/misc/location/xtra/socket_hal_xtra";
9972863c4092108a764d8537b453e66357939e19062Kevin Tang        struct sockaddr_un addr = { .sun_family = AF_UNIX };
9982863c4092108a764d8537b453e66357939e19062Kevin Tang        snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", socketPath);
9992863c4092108a764d8537b453e66357939e19062Kevin Tang
10002863c4092108a764d8537b453e66357939e19062Kevin Tang        if (::connect(socketFd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
10012863c4092108a764d8537b453e66357939e19062Kevin Tang            LOC_LOGe("cannot connect to XTRA. reason:%s", strerror(errno));
10022863c4092108a764d8537b453e66357939e19062Kevin Tang            if (::close(socketFd)) {
10032863c4092108a764d8537b453e66357939e19062Kevin Tang                LOC_LOGe("close socket error. reason:%s", strerror(errno));
10042863c4092108a764d8537b453e66357939e19062Kevin Tang            }
10052863c4092108a764d8537b453e66357939e19062Kevin Tang            socketFd = -1;
10062863c4092108a764d8537b453e66357939e19062Kevin Tang        }
10072863c4092108a764d8537b453e66357939e19062Kevin Tang    }
10082863c4092108a764d8537b453e66357939e19062Kevin Tang
10092863c4092108a764d8537b453e66357939e19062Kevin Tang    return socketFd;
10102863c4092108a764d8537b453e66357939e19062Kevin Tang}
10112863c4092108a764d8537b453e66357939e19062Kevin Tang
10122863c4092108a764d8537b453e66357939e19062Kevin Tangstatic inline void closeSocket(const int socketFd) {
10132863c4092108a764d8537b453e66357939e19062Kevin Tang    if (socketFd >= 0) {
10142863c4092108a764d8537b453e66357939e19062Kevin Tang        if(::close(socketFd)) {
10152863c4092108a764d8537b453e66357939e19062Kevin Tang            LOC_LOGe("close socket error. reason:%s", strerror(errno));
10162863c4092108a764d8537b453e66357939e19062Kevin Tang        }
10172863c4092108a764d8537b453e66357939e19062Kevin Tang    }
10182863c4092108a764d8537b453e66357939e19062Kevin Tang}
10192863c4092108a764d8537b453e66357939e19062Kevin Tang
10202863c4092108a764d8537b453e66357939e19062Kevin Tangstatic inline bool sendConnectionEvent(const bool connected, const uint8_t type) {
10212863c4092108a764d8537b453e66357939e19062Kevin Tang    int socketFd = createSocket();
10222863c4092108a764d8537b453e66357939e19062Kevin Tang    if (socketFd < 0) {
10232863c4092108a764d8537b453e66357939e19062Kevin Tang        LOC_LOGe("XTRA unreachable. sending failed.");
10242863c4092108a764d8537b453e66357939e19062Kevin Tang        return false;
10252863c4092108a764d8537b453e66357939e19062Kevin Tang    }
10262863c4092108a764d8537b453e66357939e19062Kevin Tang
10272863c4092108a764d8537b453e66357939e19062Kevin Tang    std::stringstream ss;
10282863c4092108a764d8537b453e66357939e19062Kevin Tang    ss <<  "connection";
10292863c4092108a764d8537b453e66357939e19062Kevin Tang    ss << " " << (connected ? "1" : "0");
10302863c4092108a764d8537b453e66357939e19062Kevin Tang    ss << " " << type;
10312863c4092108a764d8537b453e66357939e19062Kevin Tang    ss << "\n"; // append seperator
10322863c4092108a764d8537b453e66357939e19062Kevin Tang
10332863c4092108a764d8537b453e66357939e19062Kevin Tang    const std::string& data = ss.str();
10342863c4092108a764d8537b453e66357939e19062Kevin Tang    int remain = data.length();
10352863c4092108a764d8537b453e66357939e19062Kevin Tang    ssize_t sent = 0;
10362863c4092108a764d8537b453e66357939e19062Kevin Tang
10372863c4092108a764d8537b453e66357939e19062Kevin Tang    while (remain > 0 &&
10382863c4092108a764d8537b453e66357939e19062Kevin Tang          (sent = ::send(socketFd, data.c_str() + (data.length() - remain),
10392863c4092108a764d8537b453e66357939e19062Kevin Tang                       remain, MSG_NOSIGNAL)) > 0) {
10402863c4092108a764d8537b453e66357939e19062Kevin Tang        remain -= sent;
10412863c4092108a764d8537b453e66357939e19062Kevin Tang    }
10422863c4092108a764d8537b453e66357939e19062Kevin Tang
10432863c4092108a764d8537b453e66357939e19062Kevin Tang    if (sent < 0) {
10442863c4092108a764d8537b453e66357939e19062Kevin Tang        LOC_LOGe("sending error. reason:%s", strerror(errno));
10452863c4092108a764d8537b453e66357939e19062Kevin Tang    }
10462863c4092108a764d8537b453e66357939e19062Kevin Tang
10472863c4092108a764d8537b453e66357939e19062Kevin Tang    closeSocket(socketFd);
10482863c4092108a764d8537b453e66357939e19062Kevin Tang
10492863c4092108a764d8537b453e66357939e19062Kevin Tang    return (remain == 0);
10502863c4092108a764d8537b453e66357939e19062Kevin Tang}
10512863c4092108a764d8537b453e66357939e19062Kevin Tang
105234ee09551764b045fdc02df754157473125edf60Kevin Tang// Below stub functions are members of sLocEngAGpsRilInterface
105334ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void loc_agps_ril_init( AGpsRilCallbacks* callbacks ) {}
105434ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void loc_agps_ril_set_ref_location(const AGpsRefLocation *agps_reflocation, size_t sz_struct) {}
105534ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void loc_agps_ril_set_set_id(AGpsSetIDType type, const char* setid) {}
105634ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void loc_agps_ril_ni_message(uint8_t *msg, size_t len) {}
10572863c4092108a764d8537b453e66357939e19062Kevin Tangstatic void loc_agps_ril_update_network_state(int connected, int type, int roaming, const char* extra_info) {
10582863c4092108a764d8537b453e66357939e19062Kevin Tang    // for XTRA
10592863c4092108a764d8537b453e66357939e19062Kevin Tang    sendConnectionEvent((connected != 0) ? true : false,
10602863c4092108a764d8537b453e66357939e19062Kevin Tang                        (uint8_t)type);
10612863c4092108a764d8537b453e66357939e19062Kevin Tang}
106234ee09551764b045fdc02df754157473125edf60Kevin Tang
106334ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
106434ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_agps_ril_update_network_availability
106534ee09551764b045fdc02df754157473125edf60Kevin Tang
106634ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
106734ee09551764b045fdc02df754157473125edf60Kevin Tang   Sets data call allow vs disallow flag to modem
106834ee09551764b045fdc02df754157473125edf60Kevin Tang   This is the only member of sLocEngAGpsRilInterface implemented.
106934ee09551764b045fdc02df754157473125edf60Kevin Tang
107034ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
107134ee09551764b045fdc02df754157473125edf60Kevin Tang   None
107234ee09551764b045fdc02df754157473125edf60Kevin Tang
107334ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
107434ee09551764b045fdc02df754157473125edf60Kevin Tang   0: success
107534ee09551764b045fdc02df754157473125edf60Kevin Tang
107634ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
107734ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
107834ee09551764b045fdc02df754157473125edf60Kevin Tang
107934ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
108034ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void loc_agps_ril_update_network_availability(int available, const char* apn)
108134ee09551764b045fdc02df754157473125edf60Kevin Tang{
108234ee09551764b045fdc02df754157473125edf60Kevin Tang    ENTRY_LOG();
108334ee09551764b045fdc02df754157473125edf60Kevin Tang    loc_eng_agps_ril_update_network_availability(loc_afw_data, available, apn);
108434ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%s, VOID_RET);
108534ee09551764b045fdc02df754157473125edf60Kevin Tang}
108634ee09551764b045fdc02df754157473125edf60Kevin Tang
10871d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russostatic int loc_agps_install_certificates(const DerEncodedCertificate* certificates,
10881d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo                                         size_t length)
10891d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo{
10901d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo    ENTRY_LOG();
10911d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo    int ret_val = loc_eng_agps_install_certificates(loc_afw_data, certificates, length);
10921d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo    EXIT_LOG(%d, ret_val);
10931d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo    return ret_val;
10941d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo}
10951d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russostatic int loc_agps_revoke_certificates(const Sha1CertificateFingerprint* fingerprints,
10961d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo                                        size_t length)
10971d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo{
10981d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo    ENTRY_LOG();
1099bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    LOC_LOGE("%s:%d]: agps_revoke_certificates not supported");
11001d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo    int ret_val = AGPS_CERTIFICATE_ERROR_GENERIC;
11011d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo    EXIT_LOG(%d, ret_val);
11021d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo    return ret_val;
11031d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo}
11041d4940024c54e7d1e63f73edd5054a18a7a01b63Dante Russo
1105fe660078f05f448ececb0b1170ecd79e600db440Kevin Tangstatic void loc_configuration_update(const char* config_data, int32_t length)
1106fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang{
1107fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang    ENTRY_LOG();
1108fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang    loc_eng_configuration_update(loc_afw_data, config_data, length);
11090c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava    switch (sGnssType)
11100c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava    {
11110c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava    case GNSS_GSS:
11120c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava    case GNSS_AUTO:
11130c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava    case GNSS_QCA1530:
11140c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava        //APQ
11150c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava        gps_conf.CAPABILITIES &= ~(GPS_CAPABILITY_MSA | GPS_CAPABILITY_MSB);
11160c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava        break;
11170c7fdf015bfdb33b14a990b280c38386cb8e1f9cVineeta Srivastava    }
1118fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang    EXIT_LOG(%s, VOID_RET);
1119fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang}
1120fe660078f05f448ececb0b1170ecd79e600db440Kevin Tang
1121e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russostatic void local_loc_cb(UlpLocation* location, void* locExt)
112234ee09551764b045fdc02df754157473125edf60Kevin Tang{
112334ee09551764b045fdc02df754157473125edf60Kevin Tang    ENTRY_LOG();
1124e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    if (NULL != location) {
112534ee09551764b045fdc02df754157473125edf60Kevin Tang        CALLBACK_LOG_CALLFLOW("location_cb - from", %d, location->position_source);
1126e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
1127e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        if (NULL != gps_loc_cb) {
1128e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo            gps_loc_cb(&location->gpsLocation);
1129e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        }
113034ee09551764b045fdc02df754157473125edf60Kevin Tang    }
113134ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%s, VOID_RET);
113234ee09551764b045fdc02df754157473125edf60Kevin Tang}
113334ee09551764b045fdc02df754157473125edf60Kevin Tang
1134e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russostatic void local_sv_cb(GpsSvStatus* sv_status, void* svExt)
113534ee09551764b045fdc02df754157473125edf60Kevin Tang{
113634ee09551764b045fdc02df754157473125edf60Kevin Tang    ENTRY_LOG();
113734ee09551764b045fdc02df754157473125edf60Kevin Tang    if (NULL != gps_sv_cb) {
113834ee09551764b045fdc02df754157473125edf60Kevin Tang        CALLBACK_LOG_CALLFLOW("sv_status_cb -", %d, sv_status->num_svs);
113934ee09551764b045fdc02df754157473125edf60Kevin Tang        gps_sv_cb(sv_status);
114034ee09551764b045fdc02df754157473125edf60Kevin Tang    }
114134ee09551764b045fdc02df754157473125edf60Kevin Tang    EXIT_LOG(%s, VOID_RET);
114234ee09551764b045fdc02df754157473125edf60Kevin Tang}
11439aba726254999bab914b3eba81f65537c5bf5354Dante Russo
1144