• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright (c) 2011-2015, 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     loc_afw_data.adapter->setXtraUserAgent();
319 
320     if(retVal) {
321         LOC_LOGE("loc_eng_init() fail!");
322         goto err;
323     }
324 
325     loc_afw_data.adapter->setPowerVoteRight(loc_get_target() == TARGET_QCA1530);
326     loc_afw_data.adapter->setPowerVote(true);
327 
328     LOC_LOGD("loc_eng_init() success!");
329 
330 err:
331     EXIT_LOG(%d, retVal);
332     return retVal;
333 }
334 
335 /*===========================================================================
336 FUNCTION    loc_cleanup
337 
338 DESCRIPTION
339    Cleans location engine. The location client handle will be released.
340 
341 DEPENDENCIES
342    None
343 
344 RETURN VALUE
345    None
346 
347 SIDE EFFECTS
348    N/A
349 
350 ===========================================================================*/
loc_cleanup()351 static void loc_cleanup()
352 {
353     ENTRY_LOG();
354 
355     loc_afw_data.adapter->setPowerVote(false);
356     loc_afw_data.adapter->setGpsLockMsg(gps_conf.GPS_LOCK);
357 
358     loc_eng_cleanup(loc_afw_data);
359     gps_loc_cb = NULL;
360     gps_sv_cb = NULL;
361 
362     EXIT_LOG(%s, VOID_RET);
363 }
364 
365 /*===========================================================================
366 FUNCTION    loc_start
367 
368 DESCRIPTION
369    Starts the tracking session
370 
371 DEPENDENCIES
372    None
373 
374 RETURN VALUE
375    0: success
376 
377 SIDE EFFECTS
378    N/A
379 
380 ===========================================================================*/
loc_start()381 static int loc_start()
382 {
383     ENTRY_LOG();
384     int ret_val = loc_eng_start(loc_afw_data);
385 
386     EXIT_LOG(%d, ret_val);
387     return ret_val;
388 }
389 
390 /*===========================================================================
391 FUNCTION    loc_stop
392 
393 DESCRIPTION
394    Stops the tracking session
395 
396 DEPENDENCIES
397    None
398 
399 RETURN VALUE
400    0: success
401 
402 SIDE EFFECTS
403    N/A
404 
405 ===========================================================================*/
loc_stop()406 static int loc_stop()
407 {
408     ENTRY_LOG();
409     int ret_val = -1;
410     ret_val = loc_eng_stop(loc_afw_data);
411 
412     EXIT_LOG(%d, ret_val);
413     return ret_val;
414 }
415 
416 /*===========================================================================
417 FUNCTION    loc_set_position_mode
418 
419 DESCRIPTION
420    Sets the mode and fix frequency for the tracking session.
421 
422 DEPENDENCIES
423    None
424 
425 RETURN VALUE
426    0: success
427 
428 SIDE EFFECTS
429    N/A
430 
431 ===========================================================================*/
loc_set_position_mode(GpsPositionMode mode,GpsPositionRecurrence recurrence,uint32_t min_interval,uint32_t preferred_accuracy,uint32_t preferred_time)432 static int  loc_set_position_mode(GpsPositionMode mode,
433                                   GpsPositionRecurrence recurrence,
434                                   uint32_t min_interval,
435                                   uint32_t preferred_accuracy,
436                                   uint32_t preferred_time)
437 {
438     ENTRY_LOG();
439     int ret_val = -1;
440     LocPositionMode locMode;
441     switch (mode) {
442     case GPS_POSITION_MODE_MS_BASED:
443         locMode = LOC_POSITION_MODE_MS_BASED;
444         break;
445     case GPS_POSITION_MODE_MS_ASSISTED:
446         locMode = LOC_POSITION_MODE_MS_ASSISTED;
447         break;
448     default:
449         locMode = LOC_POSITION_MODE_STANDALONE;
450         break;
451     }
452 
453     LocPosMode params(locMode, recurrence, min_interval,
454                       preferred_accuracy, preferred_time, NULL, NULL);
455     ret_val = loc_eng_set_position_mode(loc_afw_data, params);
456 
457     EXIT_LOG(%d, ret_val);
458     return ret_val;
459 }
460 
461 /*===========================================================================
462 FUNCTION    loc_inject_time
463 
464 DESCRIPTION
465    This is used by Java native function to do time injection.
466 
467 DEPENDENCIES
468    None
469 
470 RETURN VALUE
471    0
472 
473 SIDE EFFECTS
474    N/A
475 
476 ===========================================================================*/
loc_inject_time(GpsUtcTime time,int64_t timeReference,int uncertainty)477 static int loc_inject_time(GpsUtcTime time, int64_t timeReference, int uncertainty)
478 {
479     ENTRY_LOG();
480     int ret_val = 0;
481 
482     ret_val = loc_eng_inject_time(loc_afw_data, time,
483                                   timeReference, uncertainty);
484 
485     EXIT_LOG(%d, ret_val);
486     return ret_val;
487 }
488 
489 
490 /*===========================================================================
491 FUNCTION    loc_inject_location
492 
493 DESCRIPTION
494    This is used by Java native function to do location injection.
495 
496 DEPENDENCIES
497    None
498 
499 RETURN VALUE
500    0          : Successful
501    error code : Failure
502 
503 SIDE EFFECTS
504    N/A
505 ===========================================================================*/
loc_inject_location(double latitude,double longitude,float accuracy)506 static int loc_inject_location(double latitude, double longitude, float accuracy)
507 {
508     ENTRY_LOG();
509 
510     int ret_val = 0;
511     ret_val = loc_eng_inject_location(loc_afw_data, latitude, longitude, accuracy);
512 
513     EXIT_LOG(%d, ret_val);
514     return ret_val;
515 }
516 
517 
518 /*===========================================================================
519 FUNCTION    loc_delete_aiding_data
520 
521 DESCRIPTION
522    This is used by Java native function to delete the aiding data. The function
523    updates the global variable for the aiding data to be deleted. If the GPS
524    engine is off, the aiding data will be deleted. Otherwise, the actual action
525    will happen when gps engine is turned off.
526 
527 DEPENDENCIES
528    Assumes the aiding data type specified in GpsAidingData matches with
529    LOC API specification.
530 
531 RETURN VALUE
532    None
533 
534 SIDE EFFECTS
535    N/A
536 
537 ===========================================================================*/
loc_delete_aiding_data(GpsAidingData f)538 static void loc_delete_aiding_data(GpsAidingData f)
539 {
540     ENTRY_LOG();
541     loc_eng_delete_aiding_data(loc_afw_data, f);
542 
543     EXIT_LOG(%s, VOID_RET);
544 }
545 
get_geofence_interface(void)546 const GpsGeofencingInterface* get_geofence_interface(void)
547 {
548     ENTRY_LOG();
549     void *handle;
550     const char *error;
551     typedef const GpsGeofencingInterface* (*get_gps_geofence_interface_function) (void);
552     get_gps_geofence_interface_function get_gps_geofence_interface;
553     static const GpsGeofencingInterface* geofence_interface = NULL;
554 
555     dlerror();    /* Clear any existing error */
556 
557     handle = dlopen ("libgeofence.so", RTLD_NOW);
558 
559     if (!handle)
560     {
561         if ((error = dlerror()) != NULL)  {
562             LOC_LOGE ("%s, dlopen for libgeofence.so failed, error = %s\n", __func__, error);
563            }
564         goto exit;
565     }
566     dlerror();    /* Clear any existing error */
567     get_gps_geofence_interface = (get_gps_geofence_interface_function)dlsym(handle, "gps_geofence_get_interface");
568     if ((error = dlerror()) != NULL || NULL == get_gps_geofence_interface)  {
569         LOC_LOGE ("%s, dlsym for get_gps_geofence_interface failed, error = %s\n", __func__, error);
570         goto exit;
571      }
572 
573     geofence_interface = get_gps_geofence_interface();
574 
575 exit:
576     EXIT_LOG(%d, geofence_interface == NULL);
577     return geofence_interface;
578 }
579 /*===========================================================================
580 FUNCTION    loc_get_extension
581 
582 DESCRIPTION
583    Get the gps extension to support XTRA.
584 
585 DEPENDENCIES
586    N/A
587 
588 RETURN VALUE
589    The GPS extension interface.
590 
591 SIDE EFFECTS
592    N/A
593 
594 ===========================================================================*/
loc_get_extension(const char * name)595 const void* loc_get_extension(const char* name)
596 {
597     ENTRY_LOG();
598     const void* ret_val = NULL;
599 
600    LOC_LOGD("%s:%d] For Interface = %s\n",__func__, __LINE__, name);
601    if (strcmp(name, GPS_XTRA_INTERFACE) == 0)
602    {
603        ret_val = &sLocEngXTRAInterface;
604    }
605    else if (strcmp(name, AGPS_INTERFACE) == 0)
606    {
607        ret_val = &sLocEngAGpsInterface;
608    }
609    else if (strcmp(name, GPS_NI_INTERFACE) == 0)
610    {
611        ret_val = &sLocEngNiInterface;
612    }
613    else if (strcmp(name, AGPS_RIL_INTERFACE) == 0)
614    {
615        char baseband[PROPERTY_VALUE_MAX];
616        property_get("ro.baseband", baseband, "msm");
617        if (strcmp(baseband, "csfb") == 0)
618        {
619            ret_val = &sLocEngAGpsRilInterface;
620        }
621    }
622    else if (strcmp(name, GPS_GEOFENCING_INTERFACE) == 0)
623    {
624        if ((gps_conf.CAPABILITIES | GPS_CAPABILITY_GEOFENCING) == gps_conf.CAPABILITIES ){
625            ret_val = get_geofence_interface();
626        }
627    }
628    else if (strcmp(name, SUPL_CERTIFICATE_INTERFACE) == 0)
629    {
630        ret_val = &sLocEngAGpsCertInterface;
631    }
632    else if (strcmp(name, GNSS_CONFIGURATION_INTERFACE) == 0)
633    {
634        ret_val = &sLocEngConfigInterface;
635    }
636    else if (strcmp(name, GPS_MEASUREMENT_INTERFACE) == 0)
637    {
638        ret_val = &sLocEngGpsMeasurementInterface;
639    }
640    else
641    {
642       LOC_LOGE ("get_extension: Invalid interface passed in\n");
643    }
644     EXIT_LOG(%p, ret_val);
645     return ret_val;
646 }
647 
648 /*===========================================================================
649 FUNCTION    loc_agps_init
650 
651 DESCRIPTION
652    Initialize the AGps interface.
653 
654 DEPENDENCIES
655    NONE
656 
657 RETURN VALUE
658    0
659 
660 SIDE EFFECTS
661    N/A
662 
663 ===========================================================================*/
loc_agps_init(AGpsCallbacks * callbacks)664 static void loc_agps_init(AGpsCallbacks* callbacks)
665 {
666     ENTRY_LOG();
667     loc_eng_agps_init(loc_afw_data, (AGpsExtCallbacks*)callbacks);
668     EXIT_LOG(%s, VOID_RET);
669 }
670 
671 /*===========================================================================
672 FUNCTION    loc_agps_open
673 
674 DESCRIPTION
675    This function is called when on-demand data connection opening is successful.
676 It should inform ARM 9 about the data open result.
677 
678 DEPENDENCIES
679    NONE
680 
681 RETURN VALUE
682    0
683 
684 SIDE EFFECTS
685    N/A
686 
687 ===========================================================================*/
loc_agps_open(const char * apn)688 static int loc_agps_open(const char* apn)
689 {
690     ENTRY_LOG();
691     AGpsType agpsType = AGPS_TYPE_SUPL;
692     AGpsBearerType bearerType = AGPS_APN_BEARER_IPV4;
693     int ret_val = loc_eng_agps_open(loc_afw_data, agpsType, apn, bearerType);
694 
695     EXIT_LOG(%d, ret_val);
696     return ret_val;
697 }
698 
699 /*===========================================================================
700 FUNCTION    loc_agps_open_with_apniptype
701 
702 DESCRIPTION
703    This function is called when on-demand data connection opening is successful.
704 It should inform ARM 9 about the data open result.
705 
706 DEPENDENCIES
707    NONE
708 
709 RETURN VALUE
710    0
711 
712 SIDE EFFECTS
713    N/A
714 
715 ===========================================================================*/
loc_agps_open_with_apniptype(const char * apn,ApnIpType apnIpType)716 static int  loc_agps_open_with_apniptype(const char* apn, ApnIpType apnIpType)
717 {
718     ENTRY_LOG();
719     AGpsType agpsType = AGPS_TYPE_SUPL;
720     AGpsBearerType bearerType;
721 
722     switch (apnIpType) {
723         case APN_IP_IPV4:
724             bearerType = AGPS_APN_BEARER_IPV4;
725             break;
726         case APN_IP_IPV6:
727             bearerType = AGPS_APN_BEARER_IPV6;
728             break;
729         case APN_IP_IPV4V6:
730             bearerType = AGPS_APN_BEARER_IPV4V6;
731             break;
732         default:
733             bearerType = AGPS_APN_BEARER_IPV4;
734             break;
735     }
736 
737     int ret_val = loc_eng_agps_open(loc_afw_data, agpsType, apn, bearerType);
738 
739     EXIT_LOG(%d, ret_val);
740     return ret_val;
741 }
742 
743 /*===========================================================================
744 FUNCTION    loc_agps_closed
745 
746 DESCRIPTION
747    This function is called when on-demand data connection closing is done.
748 It should inform ARM 9 about the data close result.
749 
750 DEPENDENCIES
751    NONE
752 
753 RETURN VALUE
754    0
755 
756 SIDE EFFECTS
757    N/A
758 
759 ===========================================================================*/
loc_agps_closed()760 static int loc_agps_closed()
761 {
762     ENTRY_LOG();
763     AGpsType agpsType = AGPS_TYPE_SUPL;
764     int ret_val = loc_eng_agps_closed(loc_afw_data, agpsType);
765 
766     EXIT_LOG(%d, ret_val);
767     return ret_val;
768 }
769 
770 /*===========================================================================
771 FUNCTION    loc_agps_open_failed
772 
773 DESCRIPTION
774    This function is called when on-demand data connection opening has failed.
775 It should inform ARM 9 about the data open result.
776 
777 DEPENDENCIES
778    NONE
779 
780 RETURN VALUE
781    0
782 
783 SIDE EFFECTS
784    N/A
785 
786 ===========================================================================*/
loc_agps_open_failed()787 int loc_agps_open_failed()
788 {
789     ENTRY_LOG();
790     AGpsType agpsType = AGPS_TYPE_SUPL;
791     int ret_val = loc_eng_agps_open_failed(loc_afw_data, agpsType);
792 
793     EXIT_LOG(%d, ret_val);
794     return ret_val;
795 }
796 
797 /*===========================================================================
798 FUNCTION    loc_agps_set_server
799 
800 DESCRIPTION
801    If loc_eng_set_server is called before loc_eng_init, it doesn't work. This
802    proxy buffers server settings and calls loc_eng_set_server when the client is
803    open.
804 
805 DEPENDENCIES
806    NONE
807 
808 RETURN VALUE
809    0
810 
811 SIDE EFFECTS
812    N/A
813 
814 ===========================================================================*/
loc_agps_set_server(AGpsType type,const char * hostname,int port)815 static int loc_agps_set_server(AGpsType type, const char* hostname, int port)
816 {
817     ENTRY_LOG();
818     LocServerType serverType;
819     switch (type) {
820     case AGPS_TYPE_SUPL:
821         serverType = LOC_AGPS_SUPL_SERVER;
822         break;
823     case AGPS_TYPE_C2K:
824         serverType = LOC_AGPS_CDMA_PDE_SERVER;
825         break;
826     default:
827         serverType = LOC_AGPS_SUPL_SERVER;
828     }
829     int ret_val = loc_eng_set_server_proxy(loc_afw_data, serverType, hostname, port);
830 
831     EXIT_LOG(%d, ret_val);
832     return ret_val;
833 }
834 
835 /*===========================================================================
836 FUNCTIONf571
837     loc_xtra_init
838 
839 DESCRIPTION
840    Initialize XTRA module.
841 
842 DEPENDENCIES
843    None
844 
845 RETURN VALUE
846    0: success
847 
848 SIDE EFFECTS
849    N/A
850 
851 ===========================================================================*/
loc_xtra_init(GpsXtraCallbacks * callbacks)852 static int loc_xtra_init(GpsXtraCallbacks* callbacks)
853 {
854     ENTRY_LOG();
855     GpsXtraExtCallbacks extCallbacks;
856     memset(&extCallbacks, 0, sizeof(extCallbacks));
857     extCallbacks.download_request_cb = callbacks->download_request_cb;
858     int ret_val = loc_eng_xtra_init(loc_afw_data, &extCallbacks);
859 
860     EXIT_LOG(%d, ret_val);
861     return ret_val;
862 }
863 
864 
865 /*===========================================================================
866 FUNCTION    loc_xtra_inject_data
867 
868 DESCRIPTION
869    Initialize XTRA module.
870 
871 DEPENDENCIES
872    None
873 
874 RETURN VALUE
875    0: success
876 
877 SIDE EFFECTS
878    N/A
879 
880 ===========================================================================*/
loc_xtra_inject_data(char * data,int length)881 static int loc_xtra_inject_data(char* data, int length)
882 {
883     ENTRY_LOG();
884     int ret_val = -1;
885     if( (data != NULL) && ((unsigned int)length <= XTRA_DATA_MAX_SIZE))
886         ret_val = loc_eng_xtra_inject_data(loc_afw_data, data, length);
887     else
888         LOC_LOGE("%s, Could not inject XTRA data. Buffer address: %p, length: %d",
889                  __func__, data, length);
890     EXIT_LOG(%d, ret_val);
891     return ret_val;
892 }
893 
894 /*===========================================================================
895 FUNCTION    loc_gps_measurement_init
896 
897 DESCRIPTION
898    This function initializes the gps measurement interface
899 
900 DEPENDENCIES
901    NONE
902 
903 RETURN VALUE
904    None
905 
906 SIDE EFFECTS
907    N/A
908 
909 ===========================================================================*/
loc_gps_measurement_init(GpsMeasurementCallbacks * callbacks)910 static int loc_gps_measurement_init(GpsMeasurementCallbacks* callbacks)
911 {
912     ENTRY_LOG();
913     int ret_val = loc_eng_gps_measurement_init(loc_afw_data,
914                                                callbacks);
915 
916     EXIT_LOG(%d, ret_val);
917     return ret_val;
918 }
919 
920 /*===========================================================================
921 FUNCTION    loc_gps_measurement_close
922 
923 DESCRIPTION
924    This function closes the gps measurement interface
925 
926 DEPENDENCIES
927    NONE
928 
929 RETURN VALUE
930    None
931 
932 SIDE EFFECTS
933    N/A
934 
935 ===========================================================================*/
loc_gps_measurement_close()936 static void loc_gps_measurement_close()
937 {
938     ENTRY_LOG();
939     loc_eng_gps_measurement_close(loc_afw_data);
940 
941     EXIT_LOG(%s, VOID_RET);
942 }
943 
944 /*===========================================================================
945 FUNCTION    loc_ni_init
946 
947 DESCRIPTION
948    This function initializes the NI interface
949 
950 DEPENDENCIES
951    NONE
952 
953 RETURN VALUE
954    None
955 
956 SIDE EFFECTS
957    N/A
958 
959 ===========================================================================*/
loc_ni_init(GpsNiCallbacks * callbacks)960 void loc_ni_init(GpsNiCallbacks *callbacks)
961 {
962     ENTRY_LOG();
963     loc_eng_ni_init(loc_afw_data,(GpsNiExtCallbacks*) callbacks);
964     EXIT_LOG(%s, VOID_RET);
965 }
966 
967 /*===========================================================================
968 FUNCTION    loc_ni_respond
969 
970 DESCRIPTION
971    This function sends an NI respond to the modem processor
972 
973 DEPENDENCIES
974    NONE
975 
976 RETURN VALUE
977    None
978 
979 SIDE EFFECTS
980    N/A
981 
982 ===========================================================================*/
loc_ni_respond(int notif_id,GpsUserResponseType user_response)983 void loc_ni_respond(int notif_id, GpsUserResponseType user_response)
984 {
985     ENTRY_LOG();
986     loc_eng_ni_respond(loc_afw_data, notif_id, user_response);
987     EXIT_LOG(%s, VOID_RET);
988 }
989 
990 // Below stub functions are members of sLocEngAGpsRilInterface
loc_agps_ril_init(AGpsRilCallbacks * callbacks)991 static void loc_agps_ril_init( AGpsRilCallbacks* callbacks ) {}
loc_agps_ril_set_ref_location(const AGpsRefLocation * agps_reflocation,size_t sz_struct)992 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)993 static void loc_agps_ril_set_set_id(AGpsSetIDType type, const char* setid) {}
loc_agps_ril_ni_message(uint8_t * msg,size_t len)994 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)995 static void loc_agps_ril_update_network_state(int connected, int type, int roaming, const char* extra_info) {}
996 
997 /*===========================================================================
998 FUNCTION    loc_agps_ril_update_network_availability
999 
1000 DESCRIPTION
1001    Sets data call allow vs disallow flag to modem
1002    This is the only member of sLocEngAGpsRilInterface implemented.
1003 
1004 DEPENDENCIES
1005    None
1006 
1007 RETURN VALUE
1008    0: success
1009 
1010 SIDE EFFECTS
1011    N/A
1012 
1013 ===========================================================================*/
loc_agps_ril_update_network_availability(int available,const char * apn)1014 static void loc_agps_ril_update_network_availability(int available, const char* apn)
1015 {
1016     ENTRY_LOG();
1017     loc_eng_agps_ril_update_network_availability(loc_afw_data, available, apn);
1018     EXIT_LOG(%s, VOID_RET);
1019 }
1020 
loc_agps_install_certificates(const DerEncodedCertificate * certificates,size_t length)1021 static int loc_agps_install_certificates(const DerEncodedCertificate* certificates,
1022                                          size_t length)
1023 {
1024     ENTRY_LOG();
1025     int ret_val = loc_eng_agps_install_certificates(loc_afw_data, certificates, length);
1026     EXIT_LOG(%d, ret_val);
1027     return ret_val;
1028 }
loc_agps_revoke_certificates(const Sha1CertificateFingerprint * fingerprints,size_t length)1029 static int loc_agps_revoke_certificates(const Sha1CertificateFingerprint* fingerprints,
1030                                         size_t length)
1031 {
1032     ENTRY_LOG();
1033     LOC_LOGE("%s:%d]: agps_revoke_certificates not supported");
1034     int ret_val = AGPS_CERTIFICATE_ERROR_GENERIC;
1035     EXIT_LOG(%d, ret_val);
1036     return ret_val;
1037 }
1038 
loc_configuration_update(const char * config_data,int32_t length)1039 static void loc_configuration_update(const char* config_data, int32_t length)
1040 {
1041     ENTRY_LOG();
1042     loc_eng_configuration_update(loc_afw_data, config_data, length);
1043     switch (sGnssType)
1044     {
1045     case GNSS_GSS:
1046     case GNSS_AUTO:
1047     case GNSS_QCA1530:
1048         //APQ
1049         gps_conf.CAPABILITIES &= ~(GPS_CAPABILITY_MSA | GPS_CAPABILITY_MSB);
1050         break;
1051     }
1052     EXIT_LOG(%s, VOID_RET);
1053 }
1054 
local_loc_cb(UlpLocation * location,void * locExt)1055 static void local_loc_cb(UlpLocation* location, void* locExt)
1056 {
1057     ENTRY_LOG();
1058     if (NULL != location) {
1059         CALLBACK_LOG_CALLFLOW("location_cb - from", %d, location->position_source);
1060 
1061         if (NULL != gps_loc_cb) {
1062             gps_loc_cb(&location->gpsLocation);
1063         }
1064     }
1065     EXIT_LOG(%s, VOID_RET);
1066 }
1067 
local_sv_cb(GpsSvStatus * sv_status,void * svExt)1068 static void local_sv_cb(GpsSvStatus* sv_status, void* svExt)
1069 {
1070     ENTRY_LOG();
1071     if (NULL != gps_sv_cb) {
1072         CALLBACK_LOG_CALLFLOW("sv_status_cb -", %d, sv_status->num_svs);
1073         gps_sv_cb(sv_status);
1074     }
1075     EXIT_LOG(%s, VOID_RET);
1076 }
1077 
1078