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