• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright (c) 2009-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_eng"
32 
33 #include <stdint.h>
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include <unistd.h>
37 #include <dlfcn.h>
38 #include <ctype.h>
39 #include <math.h>
40 #include <pthread.h>
41 #include <arpa/inet.h>
42 #include <netinet/in.h>         /* struct sockaddr_in */
43 #include <sys/socket.h>
44 #include <sys/time.h>
45 #include <netdb.h>
46 #include <time.h>
47 #include <new>
48 #include <LocEngAdapter.h>
49 
50 #include <cutils/sched_policy.h>
51 #ifndef USE_GLIB
52 #include <utils/SystemClock.h>
53 #include <utils/Log.h>
54 #endif /* USE_GLIB */
55 
56 #ifdef USE_GLIB
57 #include <glib.h>
58 #include <sys/syscall.h>
59 #endif /* USE_GLIB */
60 
61 #include <string.h>
62 
63 #include <loc_eng.h>
64 #include <loc_eng_ni.h>
65 #include <loc_eng_dmn_conn.h>
66 #include <loc_eng_dmn_conn_handler.h>
67 #include <loc_eng_msg.h>
68 #include <loc_eng_nmea.h>
69 #include <msg_q.h>
70 #include <loc.h>
71 #include "log_util.h"
72 #include "platform_lib_includes.h"
73 #include "loc_core_log.h"
74 #include "loc_eng_log.h"
75 
76 #define SUCCESS TRUE
77 #define FAILURE FALSE
78 
79 #ifndef GPS_CONF_FILE
80 #define GPS_CONF_FILE            "/etc/gps.conf"   //??? platform independent
81 #endif
82 
83 #ifndef SAP_CONF_FILE
84 #define SAP_CONF_FILE            "/etc/sap.conf"
85 #endif
86 
87 #define XTRA1_GPSONEXTRA         "xtra1.gpsonextra.net"
88 
89 using namespace loc_core;
90 
91 boolean configAlreadyRead = false;
92 unsigned int agpsStatus = 0;
93 loc_gps_cfg_s_type gps_conf;
94 loc_sap_cfg_s_type sap_conf;
95 
96 /* Parameter spec table */
97 static const loc_param_s_type gps_conf_table[] =
98 {
99   {"GPS_LOCK",                       &gps_conf.GPS_LOCK,                       NULL, 'n'},
100   {"SUPL_VER",                       &gps_conf.SUPL_VER,                       NULL, 'n'},
101   {"LPP_PROFILE",                    &gps_conf.LPP_PROFILE,                    NULL, 'n'},
102   {"A_GLONASS_POS_PROTOCOL_SELECT",  &gps_conf.A_GLONASS_POS_PROTOCOL_SELECT,  NULL, 'n'},
103   {"AGPS_CERT_WRITABLE_MASK",        &gps_conf.AGPS_CERT_WRITABLE_MASK,        NULL, 'n'},
104   {"SUPL_MODE",                      &gps_conf.SUPL_MODE,                      NULL, 'n'},
105   {"INTERMEDIATE_POS",               &gps_conf.INTERMEDIATE_POS,               NULL, 'n'},
106   {"ACCURACY_THRES",                 &gps_conf.ACCURACY_THRES,                 NULL, 'n'},
107   {"NMEA_PROVIDER",                  &gps_conf.NMEA_PROVIDER,                  NULL, 'n'},
108   {"CAPABILITIES",                   &gps_conf.CAPABILITIES,                   NULL, 'n'},
109   {"XTRA_VERSION_CHECK",             &gps_conf.XTRA_VERSION_CHECK,             NULL, 'n'},
110   {"XTRA_SERVER_1",                  &gps_conf.XTRA_SERVER_1,                  NULL, 's'},
111   {"XTRA_SERVER_2",                  &gps_conf.XTRA_SERVER_2,                  NULL, 's'},
112   {"XTRA_SERVER_3",                  &gps_conf.XTRA_SERVER_3,                  NULL, 's'},
113   {"USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL",  &gps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL,          NULL, 'n'},
114 };
115 
116 static const loc_param_s_type sap_conf_table[] =
117 {
118   {"GYRO_BIAS_RANDOM_WALK",          &sap_conf.GYRO_BIAS_RANDOM_WALK,          &sap_conf.GYRO_BIAS_RANDOM_WALK_VALID, 'f'},
119   {"ACCEL_RANDOM_WALK_SPECTRAL_DENSITY",     &sap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY,    &sap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 'f'},
120   {"ANGLE_RANDOM_WALK_SPECTRAL_DENSITY",     &sap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY,    &sap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 'f'},
121   {"RATE_RANDOM_WALK_SPECTRAL_DENSITY",      &sap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY,     &sap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 'f'},
122   {"VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY",  &sap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY, &sap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 'f'},
123   {"SENSOR_ACCEL_BATCHES_PER_SEC",   &sap_conf.SENSOR_ACCEL_BATCHES_PER_SEC,   NULL, 'n'},
124   {"SENSOR_ACCEL_SAMPLES_PER_BATCH", &sap_conf.SENSOR_ACCEL_SAMPLES_PER_BATCH, NULL, 'n'},
125   {"SENSOR_GYRO_BATCHES_PER_SEC",    &sap_conf.SENSOR_GYRO_BATCHES_PER_SEC,    NULL, 'n'},
126   {"SENSOR_GYRO_SAMPLES_PER_BATCH",  &sap_conf.SENSOR_GYRO_SAMPLES_PER_BATCH,  NULL, 'n'},
127   {"SENSOR_ACCEL_BATCHES_PER_SEC_HIGH",   &sap_conf.SENSOR_ACCEL_BATCHES_PER_SEC_HIGH,   NULL, 'n'},
128   {"SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH", &sap_conf.SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH, NULL, 'n'},
129   {"SENSOR_GYRO_BATCHES_PER_SEC_HIGH",    &sap_conf.SENSOR_GYRO_BATCHES_PER_SEC_HIGH,    NULL, 'n'},
130   {"SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH",  &sap_conf.SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH,  NULL, 'n'},
131   {"SENSOR_CONTROL_MODE",            &sap_conf.SENSOR_CONTROL_MODE,            NULL, 'n'},
132   {"SENSOR_USAGE",                   &sap_conf.SENSOR_USAGE,                   NULL, 'n'},
133   {"SENSOR_ALGORITHM_CONFIG_MASK",   &sap_conf.SENSOR_ALGORITHM_CONFIG_MASK,   NULL, 'n'},
134   {"SENSOR_PROVIDER",                &sap_conf.SENSOR_PROVIDER,                NULL, 'n'}
135 };
136 
loc_default_parameters(void)137 static void loc_default_parameters(void)
138 {
139    /*Defaults for gps.conf*/
140    gps_conf.INTERMEDIATE_POS = 0;
141    gps_conf.ACCURACY_THRES = 0;
142    gps_conf.NMEA_PROVIDER = 0;
143    gps_conf.GPS_LOCK = 0;
144    gps_conf.SUPL_VER = 0x10000;
145    gps_conf.SUPL_MODE = 0x3;
146    gps_conf.CAPABILITIES = 0x7;
147    /* LTE Positioning Profile configuration is disable by default*/
148    gps_conf.LPP_PROFILE = 0;
149    /*By default no positioning protocol is selected on A-GLONASS system*/
150    gps_conf.A_GLONASS_POS_PROTOCOL_SELECT = 0;
151    /*XTRA version check is disabled by default*/
152    gps_conf.XTRA_VERSION_CHECK=0;
153    /*Use emergency PDN by default*/
154    gps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL = 1;
155 
156    /*Defaults for sap.conf*/
157    sap_conf.GYRO_BIAS_RANDOM_WALK = 0;
158    sap_conf.SENSOR_ACCEL_BATCHES_PER_SEC = 2;
159    sap_conf.SENSOR_ACCEL_SAMPLES_PER_BATCH = 5;
160    sap_conf.SENSOR_GYRO_BATCHES_PER_SEC = 2;
161    sap_conf.SENSOR_GYRO_SAMPLES_PER_BATCH = 5;
162    sap_conf.SENSOR_ACCEL_BATCHES_PER_SEC_HIGH = 4;
163    sap_conf.SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH = 25;
164    sap_conf.SENSOR_GYRO_BATCHES_PER_SEC_HIGH = 4;
165    sap_conf.SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH = 25;
166    sap_conf.SENSOR_CONTROL_MODE = 0; /* AUTO */
167    sap_conf.SENSOR_USAGE = 0; /* Enabled */
168    sap_conf.SENSOR_ALGORITHM_CONFIG_MASK = 0; /* INS Disabled = FALSE*/
169    /* Values MUST be set by OEMs in configuration for sensor-assisted
170       navigation to work. There are NO default values */
171    sap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY = 0;
172    sap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY = 0;
173    sap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY = 0;
174    sap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY = 0;
175    sap_conf.GYRO_BIAS_RANDOM_WALK_VALID = 0;
176    sap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID = 0;
177    sap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID = 0;
178    sap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID = 0;
179    sap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID = 0;
180    /* default provider is SSC */
181    sap_conf.SENSOR_PROVIDER = 1;
182 
183    /* None of the 10 slots for agps certificates are writable by default */
184    gps_conf.AGPS_CERT_WRITABLE_MASK = 0;
185 }
186 
187 // 2nd half of init(), singled out for
188 // modem restart to use.
189 static int loc_eng_reinit(loc_eng_data_s_type &loc_eng_data);
190 static void loc_eng_agps_reinit(loc_eng_data_s_type &loc_eng_data);
191 
192 static int loc_eng_set_server(loc_eng_data_s_type &loc_eng_data,
193                               LocServerType type, const char *hostname, int port);
194 // Internal functions
195 static void loc_inform_gps_status(loc_eng_data_s_type &loc_eng_data,
196                                   GpsStatusValue status);
197 static void loc_eng_report_status(loc_eng_data_s_type &loc_eng_data,
198                                   GpsStatusValue status);
199 static void loc_eng_process_conn_request(loc_eng_data_s_type &loc_eng_data,
200                                          int connHandle, AGpsType agps_type);
201 static void loc_eng_agps_close_status(loc_eng_data_s_type &loc_eng_data, int is_succ);
202 static void loc_eng_handle_engine_down(loc_eng_data_s_type &loc_eng_data) ;
203 static void loc_eng_handle_engine_up(loc_eng_data_s_type &loc_eng_data) ;
204 
205 static int loc_eng_start_handler(loc_eng_data_s_type &loc_eng_data);
206 static int loc_eng_stop_handler(loc_eng_data_s_type &loc_eng_data);
207 static int loc_eng_get_zpp_handler(loc_eng_data_s_type &loc_eng_data);
208 static void deleteAidingData(loc_eng_data_s_type &logEng);
209 static AgpsStateMachine*
210 getAgpsStateMachine(loc_eng_data_s_type& logEng, AGpsExtType agpsType);
211 static int dataCallCb(void *cb_data);
update_aiding_data_for_deletion(loc_eng_data_s_type & loc_eng_data)212 static void update_aiding_data_for_deletion(loc_eng_data_s_type& loc_eng_data) {
213     if (loc_eng_data.engine_status != GPS_STATUS_ENGINE_ON &&
214         loc_eng_data.aiding_data_for_deletion != 0)
215     {
216         loc_eng_data.adapter->deleteAidingData(loc_eng_data.aiding_data_for_deletion);
217         loc_eng_data.aiding_data_for_deletion = 0;
218     }
219 }
220 
noProc(void * data)221 static void* noProc(void* data)
222 {
223     return NULL;
224 }
225 
226 /*********************************************************************
227  * definitions of the static messages used in the file
228  *********************************************************************/
229 //        case LOC_ENG_MSG_REQUEST_NI:
LocEngRequestNi(void * locEng,GpsNiNotification & notif,const void * data)230 LocEngRequestNi::LocEngRequestNi(void* locEng,
231                                  GpsNiNotification &notif,
232                                  const void* data) :
233     LocMsg(), mLocEng(locEng), mNotify(notif), mPayload(data) {
234     locallog();
235 }
proc() const236 void LocEngRequestNi::proc() const {
237     loc_eng_ni_request_handler(*((loc_eng_data_s_type*)mLocEng),
238                                &mNotify, mPayload);
239 }
locallog() const240 void LocEngRequestNi::locallog() const
241 {
242     LOC_LOGV("id: %d\n  type: %s\n  flags: %d\n  time out: %d\n  "
243              "default response: %s\n  requestor id encoding: %s\n"
244              "  text encoding: %s\n  passThroughData: %p",
245              mNotify.notification_id,
246              loc_get_ni_type_name(mNotify.ni_type),
247              mNotify.notify_flags,
248              mNotify.timeout,
249              loc_get_ni_response_name(mNotify.default_response),
250              loc_get_ni_encoding_name(mNotify.requestor_id_encoding),
251              loc_get_ni_encoding_name(mNotify.text_encoding),
252              mPayload);
253 }
log() const254 inline void LocEngRequestNi::log() const {
255     locallog();
256 }
257 
258 //        case LOC_ENG_MSG_INFORM_NI_RESPONSE:
259 // in loc_eng_ni.cpp
260 
261 //        case LOC_ENG_MSG_START_FIX:
LocEngStartFix(LocEngAdapter * adapter)262 LocEngStartFix::LocEngStartFix(LocEngAdapter* adapter) :
263     LocMsg(), mAdapter(adapter)
264 {
265     locallog();
266 }
proc() const267 inline void LocEngStartFix::proc() const
268 {
269     loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mAdapter->getOwner();
270     loc_eng_start_handler(*locEng);
271 }
locallog() const272 inline void LocEngStartFix::locallog() const
273 {
274     LOC_LOGV("LocEngStartFix");
275 }
log() const276 inline void LocEngStartFix::log() const
277 {
278     locallog();
279 }
send() const280 void LocEngStartFix::send() const {
281     mAdapter->sendMsg(this);
282 }
283 
284 //        case LOC_ENG_MSG_STOP_FIX:
LocEngStopFix(LocEngAdapter * adapter)285 LocEngStopFix::LocEngStopFix(LocEngAdapter* adapter) :
286     LocMsg(), mAdapter(adapter)
287 {
288     locallog();
289 }
proc() const290 inline void LocEngStopFix::proc() const
291 {
292     loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mAdapter->getOwner();
293     loc_eng_stop_handler(*locEng);
294 }
locallog() const295 inline void LocEngStopFix::locallog() const
296 {
297     LOC_LOGV("LocEngStopFix");
298 }
log() const299 inline void LocEngStopFix::log() const
300 {
301     locallog();
302 }
send() const303 void LocEngStopFix::send() const {
304     mAdapter->sendMsg(this);
305 }
306 
307 //        case LOC_ENG_MSG_SET_POSITION_MODE:
LocEngPositionMode(LocEngAdapter * adapter,LocPosMode & mode)308 LocEngPositionMode::LocEngPositionMode(LocEngAdapter* adapter,
309                                        LocPosMode &mode) :
310     LocMsg(), mAdapter(adapter), mPosMode(mode)
311 {
312     mPosMode.logv();
313 }
proc() const314 inline void LocEngPositionMode::proc() const {
315     mAdapter->setPositionMode(&mPosMode);
316 }
log() const317 inline void LocEngPositionMode::log() const {
318     mPosMode.logv();
319 }
send() const320 void LocEngPositionMode::send() const {
321     mAdapter->sendMsg(this);
322 }
323 
LocEngGetZpp(LocEngAdapter * adapter)324 LocEngGetZpp::LocEngGetZpp(LocEngAdapter* adapter) :
325     LocMsg(), mAdapter(adapter)
326 {
327     locallog();
328 }
proc() const329 inline void LocEngGetZpp::proc() const
330 {
331     loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mAdapter->getOwner();
332     loc_eng_get_zpp_handler(*locEng);
333 }
locallog() const334 inline void LocEngGetZpp::locallog() const
335 {
336     LOC_LOGV("LocEngGetZpp");
337 }
log() const338 inline void LocEngGetZpp::log() const
339 {
340     locallog();
341 }
send() const342 void LocEngGetZpp::send() const {
343     mAdapter->sendMsg(this);
344 }
345 
346 struct LocEngSetTime : public LocMsg {
347     LocEngAdapter* mAdapter;
348     const GpsUtcTime mTime;
349     const int64_t mTimeReference;
350     const int mUncertainty;
LocEngSetTimeLocEngSetTime351     inline LocEngSetTime(LocEngAdapter* adapter,
352                          GpsUtcTime t, int64_t tf, int unc) :
353         LocMsg(), mAdapter(adapter),
354         mTime(t), mTimeReference(tf), mUncertainty(unc)
355     {
356         locallog();
357     }
procLocEngSetTime358     inline virtual void proc() const {
359         mAdapter->setTime(mTime, mTimeReference, mUncertainty);
360     }
locallogLocEngSetTime361     inline void locallog() const {
362         LOC_LOGV("time: %lld\n  timeReference: %lld\n  uncertainty: %d",
363                  mTime, mTimeReference, mUncertainty);
364     }
logLocEngSetTime365     inline virtual void log() const {
366         locallog();
367     }
368 };
369 
370  //       case LOC_ENG_MSG_INJECT_LOCATION:
371 struct LocEngInjectLocation : public LocMsg {
372     LocEngAdapter* mAdapter;
373     const double mLatitude;
374     const double mLongitude;
375     const float mAccuracy;
LocEngInjectLocationLocEngInjectLocation376     inline LocEngInjectLocation(LocEngAdapter* adapter,
377                                 double lat, double lon, float accur) :
378         LocMsg(), mAdapter(adapter),
379         mLatitude(lat), mLongitude(lon), mAccuracy(accur)
380     {
381         locallog();
382     }
procLocEngInjectLocation383     inline virtual void proc() const {
384         mAdapter->injectPosition(mLatitude, mLongitude, mAccuracy);
385     }
locallogLocEngInjectLocation386     inline void locallog() const {
387         LOC_LOGV("latitude: %f\n  longitude: %f\n  accuracy: %f",
388                  mLatitude, mLongitude, mAccuracy);
389     }
logLocEngInjectLocation390     inline virtual void log() const {
391         locallog();
392     }
393 };
394 
395 //        case LOC_ENG_MSG_SET_SERVER_IPV4:
396 struct LocEngSetServerIpv4 : public LocMsg {
397     LocEngAdapter* mAdapter;
398     const unsigned int mNlAddr;
399     const int mPort;
400     const LocServerType mServerType;
LocEngSetServerIpv4LocEngSetServerIpv4401     inline LocEngSetServerIpv4(LocEngAdapter* adapter,
402                                unsigned int ip,
403                                int port,
404                                LocServerType type) :
405         LocMsg(), mAdapter(adapter),
406         mNlAddr(ip), mPort(port), mServerType(type)
407     {
408         locallog();
409     }
procLocEngSetServerIpv4410     inline virtual void proc() const {
411         mAdapter->setServer(mNlAddr, mPort, mServerType);
412     }
locallogLocEngSetServerIpv4413     inline void locallog() const {
414         LOC_LOGV("LocEngSetServerIpv4 - addr: %x, port: %d, type: %s",
415                  mNlAddr, mPort, loc_get_server_type_name(mServerType));
416     }
logLocEngSetServerIpv4417     inline virtual void log() const {
418         locallog();
419     }
420 };
421 
422 //        case LOC_ENG_MSG_SET_SERVER_URL:
423 struct LocEngSetServerUrl : public LocMsg {
424     LocEngAdapter* mAdapter;
425     const int mLen;
426     char* mUrl;
LocEngSetServerUrlLocEngSetServerUrl427     inline LocEngSetServerUrl(LocEngAdapter* adapter,
428                               char* urlString,
429                               int url_len) :
430         LocMsg(), mAdapter(adapter),
431         mLen(url_len), mUrl(new char[mLen+1])
432     {
433         memcpy((void*)mUrl, (void*)urlString, url_len);
434         mUrl[mLen] = 0;
435         locallog();
436     }
~LocEngSetServerUrlLocEngSetServerUrl437     inline ~LocEngSetServerUrl()
438     {
439         delete[] mUrl;
440     }
procLocEngSetServerUrl441     inline virtual void proc() const {
442         mAdapter->setServer(mUrl, mLen);
443     }
locallogLocEngSetServerUrl444     inline void locallog() const {
445         LOC_LOGV("LocEngSetServerUrl - url: %s", mUrl);
446     }
logLocEngSetServerUrl447     inline virtual void log() const {
448         locallog();
449     }
450 };
451 
452 //        case LOC_ENG_MSG_A_GLONASS_PROTOCOL:
453 struct LocEngAGlonassProtocol : public LocMsg {
454     LocEngAdapter* mAdapter;
455     const unsigned long mAGlonassProtocl;
LocEngAGlonassProtocolLocEngAGlonassProtocol456     inline LocEngAGlonassProtocol(LocEngAdapter* adapter,
457                                   unsigned long protocol) :
458         LocMsg(), mAdapter(adapter), mAGlonassProtocl(protocol)
459     {
460         locallog();
461     }
procLocEngAGlonassProtocol462     inline virtual void proc() const {
463         mAdapter->setAGLONASSProtocol(mAGlonassProtocl);
464     }
locallogLocEngAGlonassProtocol465     inline  void locallog() const {
466         LOC_LOGV("A-GLONASS protocol: 0x%lx", mAGlonassProtocl);
467     }
logLocEngAGlonassProtocol468     inline virtual void log() const {
469         locallog();
470     }
471 };
472 
473 //        case LOC_ENG_MSG_SUPL_VERSION:
474 struct LocEngSuplVer : public LocMsg {
475     LocEngAdapter* mAdapter;
476     const int mSuplVer;
LocEngSuplVerLocEngSuplVer477     inline LocEngSuplVer(LocEngAdapter* adapter,
478                          int suplVer) :
479         LocMsg(), mAdapter(adapter), mSuplVer(suplVer)
480     {
481         locallog();
482     }
procLocEngSuplVer483     inline virtual void proc() const {
484         mAdapter->setSUPLVersion(mSuplVer);
485     }
locallogLocEngSuplVer486     inline  void locallog() const {
487         LOC_LOGV("SUPL Version: %d", mSuplVer);
488     }
logLocEngSuplVer489     inline virtual void log() const {
490         locallog();
491     }
492 };
493 
494 struct LocEngSuplMode : public LocMsg {
495     UlpProxyBase* mUlp;
496 
LocEngSuplModeLocEngSuplMode497     inline LocEngSuplMode(UlpProxyBase* ulp) :
498         LocMsg(), mUlp(ulp)
499     {
500         locallog();
501     }
procLocEngSuplMode502     inline virtual void proc() const {
503         mUlp->setCapabilities(getCarrierCapabilities());
504     }
locallogLocEngSuplMode505     inline  void locallog() const {
506     }
logLocEngSuplMode507     inline virtual void log() const {
508         locallog();
509     }
510 };
511 
512 //        case LOC_ENG_MSG_LPP_CONFIG:
513 struct LocEngLppConfig : public LocMsg {
514     LocEngAdapter* mAdapter;
515     const int mLppConfig;
LocEngLppConfigLocEngLppConfig516     inline LocEngLppConfig(LocEngAdapter* adapter,
517                            int lppConfig) :
518         LocMsg(), mAdapter(adapter), mLppConfig(lppConfig)
519     {
520         locallog();
521     }
procLocEngLppConfig522     inline virtual void proc() const {
523         mAdapter->setLPPConfig(mLppConfig);
524     }
locallogLocEngLppConfig525     inline void locallog() const {
526         LOC_LOGV("LocEngLppConfig - profile: %d", mLppConfig);
527     }
logLocEngLppConfig528     inline virtual void log() const {
529         locallog();
530     }
531 };
532 
533 //        case LOC_ENG_MSG_SET_SENSOR_CONTROL_CONFIG:
534 struct LocEngSensorControlConfig : public LocMsg {
535     LocEngAdapter* mAdapter;
536     const int mSensorsDisabled;
537     const int mSensorProvider;
LocEngSensorControlConfigLocEngSensorControlConfig538     inline LocEngSensorControlConfig(LocEngAdapter* adapter,
539                                      int sensorsDisabled, int sensorProvider) :
540         LocMsg(), mAdapter(adapter), mSensorsDisabled(sensorsDisabled),
541         mSensorProvider(sensorProvider)
542     {
543         locallog();
544     }
procLocEngSensorControlConfig545     inline virtual void proc() const {
546         mAdapter->setSensorControlConfig(mSensorsDisabled, mSensorProvider);
547     }
locallogLocEngSensorControlConfig548     inline  void locallog() const {
549         LOC_LOGV("LocEngSensorControlConfig - Sensors Disabled: %d, Sensor Provider: %d",
550                  mSensorsDisabled, mSensorProvider);
551     }
logLocEngSensorControlConfig552     inline virtual void log() const {
553         locallog();
554     }
555 };
556 
557 //        case LOC_ENG_MSG_SET_SENSOR_PROPERTIES:
558 struct LocEngSensorProperties : public LocMsg {
559     LocEngAdapter* mAdapter;
560     const bool mGyroBiasVarianceRandomWalkValid;
561     const float mGyroBiasVarianceRandomWalk;
562     const bool mAccelRandomWalkValid;
563     const float mAccelRandomWalk;
564     const bool mAngleRandomWalkValid;
565     const float mAngleRandomWalk;
566     const bool mRateRandomWalkValid;
567     const float mRateRandomWalk;
568     const bool mVelocityRandomWalkValid;
569     const float mVelocityRandomWalk;
LocEngSensorPropertiesLocEngSensorProperties570     inline LocEngSensorProperties(LocEngAdapter* adapter,
571                                   bool gyroBiasRandomWalk_valid,
572                                   float gyroBiasRandomWalk,
573                                   bool accelRandomWalk_valid,
574                                   float accelRandomWalk,
575                                   bool angleRandomWalk_valid,
576                                   float angleRandomWalk,
577                                   bool rateRandomWalk_valid,
578                                   float rateRandomWalk,
579                                   bool velocityRandomWalk_valid,
580                                   float velocityRandomWalk) :
581         LocMsg(), mAdapter(adapter),
582         mGyroBiasVarianceRandomWalkValid(gyroBiasRandomWalk_valid),
583         mGyroBiasVarianceRandomWalk(gyroBiasRandomWalk),
584         mAccelRandomWalkValid(accelRandomWalk_valid),
585         mAccelRandomWalk(accelRandomWalk),
586         mAngleRandomWalkValid(angleRandomWalk_valid),
587         mAngleRandomWalk(angleRandomWalk),
588         mRateRandomWalkValid(rateRandomWalk_valid),
589         mRateRandomWalk(rateRandomWalk),
590         mVelocityRandomWalkValid(velocityRandomWalk_valid),
591         mVelocityRandomWalk(velocityRandomWalk)
592     {
593         locallog();
594     }
procLocEngSensorProperties595     inline virtual void proc() const {
596         mAdapter->setSensorProperties(mGyroBiasVarianceRandomWalkValid,
597                                       mGyroBiasVarianceRandomWalk,
598                                       mAccelRandomWalkValid,
599                                       mAccelRandomWalk,
600                                       mAngleRandomWalkValid,
601                                       mAngleRandomWalk,
602                                       mRateRandomWalkValid,
603                                       mRateRandomWalk,
604                                       mVelocityRandomWalkValid,
605                                       mVelocityRandomWalk);
606     }
locallogLocEngSensorProperties607     inline  void locallog() const {
608         LOC_LOGV("Sensor properties validity, Gyro Random walk: %d "
609                  "Accel Random Walk: %d "
610                  "Angle Random Walk: %d Rate Random Walk: %d "
611                  "Velocity Random Walk: %d\n"
612                  "Sensor properties, Gyro Random walk: %f "
613                  "Accel Random Walk: %f "
614                  "Angle Random Walk: %f Rate Random Walk: %f "
615                  "Velocity Random Walk: %f",
616                  mGyroBiasVarianceRandomWalkValid,
617                  mAccelRandomWalkValid,
618                  mAngleRandomWalkValid,
619                  mRateRandomWalkValid,
620                  mVelocityRandomWalkValid,
621                  mGyroBiasVarianceRandomWalk,
622                  mAccelRandomWalk,
623                  mAngleRandomWalk,
624                  mRateRandomWalk,
625                  mVelocityRandomWalk
626             );
627     }
logLocEngSensorProperties628     inline virtual void log() const {
629         locallog();
630     }
631 };
632 
633 //        case LOC_ENG_MSG_SET_SENSOR_PERF_CONTROL_CONFIG:
634 struct LocEngSensorPerfControlConfig : public LocMsg {
635     LocEngAdapter* mAdapter;
636     const int mControlMode;
637     const int mAccelSamplesPerBatch;
638     const int mAccelBatchesPerSec;
639     const int mGyroSamplesPerBatch;
640     const int mGyroBatchesPerSec;
641     const int mAccelSamplesPerBatchHigh;
642     const int mAccelBatchesPerSecHigh;
643     const int mGyroSamplesPerBatchHigh;
644     const int mGyroBatchesPerSecHigh;
645     const int mAlgorithmConfig;
LocEngSensorPerfControlConfigLocEngSensorPerfControlConfig646     inline LocEngSensorPerfControlConfig(LocEngAdapter* adapter,
647                                          int controlMode,
648                                          int accelSamplesPerBatch,
649                                          int accelBatchesPerSec,
650                                          int gyroSamplesPerBatch,
651                                          int gyroBatchesPerSec,
652                                          int accelSamplesPerBatchHigh,
653                                          int accelBatchesPerSecHigh,
654                                          int gyroSamplesPerBatchHigh,
655                                          int gyroBatchesPerSecHigh,
656                                          int algorithmConfig) :
657         LocMsg(), mAdapter(adapter),
658         mControlMode(controlMode),
659         mAccelSamplesPerBatch(accelSamplesPerBatch),
660         mAccelBatchesPerSec(accelBatchesPerSec),
661         mGyroSamplesPerBatch(gyroSamplesPerBatch),
662         mGyroBatchesPerSec(gyroBatchesPerSec),
663         mAccelSamplesPerBatchHigh(accelSamplesPerBatchHigh),
664         mAccelBatchesPerSecHigh(accelBatchesPerSecHigh),
665         mGyroSamplesPerBatchHigh(gyroSamplesPerBatchHigh),
666         mGyroBatchesPerSecHigh(gyroBatchesPerSecHigh),
667         mAlgorithmConfig(algorithmConfig)
668     {
669         locallog();
670     }
procLocEngSensorPerfControlConfig671     inline virtual void proc() const {
672         mAdapter->setSensorPerfControlConfig(mControlMode,
673                                              mAccelSamplesPerBatch,
674                                              mAccelBatchesPerSec,
675                                              mGyroSamplesPerBatch,
676                                              mGyroBatchesPerSec,
677                                              mAccelSamplesPerBatchHigh,
678                                              mAccelBatchesPerSecHigh,
679                                              mGyroSamplesPerBatchHigh,
680                                              mGyroBatchesPerSecHigh,
681                                              mAlgorithmConfig);
682     }
locallogLocEngSensorPerfControlConfig683     inline void locallog() const {
684         LOC_LOGV("Sensor Perf Control Config (performanceControlMode)(%u) "
685                  "accel(#smp,#batches) (%u,%u) "
686                  "gyro(#smp,#batches) (%u,%u), "
687                  "accel_high(#smp,#batches) (%u,%u) "
688                  "gyro_high(#smp,#batches) (%u,%u), "
689                  "algorithmConfig(%u)\n",
690                  mControlMode,
691                  mAccelSamplesPerBatch, mAccelBatchesPerSec,
692                  mGyroSamplesPerBatch, mGyroBatchesPerSec,
693                  mAccelSamplesPerBatchHigh, mAccelBatchesPerSecHigh,
694                  mGyroSamplesPerBatchHigh, mGyroBatchesPerSecHigh,
695                  mAlgorithmConfig);
696     }
logLocEngSensorPerfControlConfig697     inline virtual void log() const {
698         locallog();
699     }
700 };
701 
702 //        case LOC_ENG_MSG_EXT_POWER_CONFIG:
703 struct LocEngExtPowerConfig : public LocMsg {
704     LocEngAdapter* mAdapter;
705     const int mIsBatteryCharging;
LocEngExtPowerConfigLocEngExtPowerConfig706     inline LocEngExtPowerConfig(LocEngAdapter* adapter,
707                                 int isBatteryCharging) :
708         LocMsg(), mAdapter(adapter),
709         mIsBatteryCharging(isBatteryCharging)
710     {
711         locallog();
712     }
procLocEngExtPowerConfig713     inline virtual void proc() const {
714         mAdapter->setExtPowerConfig(mIsBatteryCharging);
715     }
locallogLocEngExtPowerConfig716     inline void locallog() const {
717         LOC_LOGV("LocEngExtPowerConfig - isBatteryCharging: %d",
718                  mIsBatteryCharging);
719     }
logLocEngExtPowerConfig720     inline virtual void log() const {
721         locallog();
722     }
723 };
724 
725 //        case LOC_ENG_MSG_REPORT_POSITION:
LocEngReportPosition(LocAdapterBase * adapter,UlpLocation & loc,GpsLocationExtended & locExtended,void * locExt,enum loc_sess_status st,LocPosTechMask technology)726 LocEngReportPosition::LocEngReportPosition(LocAdapterBase* adapter,
727                                            UlpLocation &loc,
728                                            GpsLocationExtended &locExtended,
729                                            void* locExt,
730                                            enum loc_sess_status st,
731                                            LocPosTechMask technology) :
732     LocMsg(), mAdapter(adapter), mLocation(loc),
733     mLocationExtended(locExtended),
734     mLocationExt(((loc_eng_data_s_type*)
735                   ((LocEngAdapter*)
736                    (mAdapter))->getOwner())->location_ext_parser(locExt)),
737     mStatus(st), mTechMask(technology)
738 {
739     locallog();
740 }
proc() const741 void LocEngReportPosition::proc() const {
742     LocEngAdapter* adapter = (LocEngAdapter*)mAdapter;
743     loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)adapter->getOwner();
744 
745     if (locEng->mute_session_state != LOC_MUTE_SESS_IN_SESSION) {
746         bool reported = false;
747         if (locEng->location_cb != NULL) {
748             if (LOC_SESS_FAILURE == mStatus) {
749                 // in case we want to handle the failure case
750                 locEng->location_cb(NULL, NULL);
751                 reported = true;
752             }
753             // what's in the else if is... (line by line)
754             // 1. this is a final fix; and
755             //   1.1 it is a Satellite fix; or
756             //   1.2 it is a sensor fix
757             // 2. (must be intermediate fix... implicit)
758             //   2.1 we accepte intermediate; and
759             //   2.2 it is NOT the case that
760             //   2.2.1 there is inaccuracy; and
761             //   2.2.2 we care about inaccuracy; and
762             //   2.2.3 the inaccuracy exceeds our tolerance
763             else if ((LOC_SESS_SUCCESS == mStatus &&
764                       ((LOC_POS_TECH_MASK_SATELLITE |
765                         LOC_POS_TECH_MASK_SENSORS   |
766                         LOC_POS_TECH_MASK_HYBRID) &
767                        mTechMask)) ||
768                      (LOC_SESS_INTERMEDIATE == locEng->intermediateFix &&
769                       !((mLocation.gpsLocation.flags &
770                          GPS_LOCATION_HAS_ACCURACY) &&
771                         (gps_conf.ACCURACY_THRES != 0) &&
772                         (mLocation.gpsLocation.accuracy >
773                          gps_conf.ACCURACY_THRES)))) {
774                 locEng->location_cb((UlpLocation*)&(mLocation),
775                                     (void*)mLocationExt);
776                 reported = true;
777             }
778         }
779 
780         // if we have reported this fix
781         if (reported &&
782             // and if this is a singleshot
783             GPS_POSITION_RECURRENCE_SINGLE ==
784             locEng->adapter->getPositionMode().recurrence) {
785             if (LOC_SESS_INTERMEDIATE == mStatus) {
786                 // modem could be still working for a final fix,
787                 // although we no longer need it.  So stopFix().
788                 locEng->adapter->stopFix();
789             }
790             // turn off the session flag.
791             locEng->adapter->setInSession(false);
792         }
793 
794         LOC_LOGV("LocEngReportPosition::proc() - generateNmea: %d, position source: %d, "
795                  "engine_status: %d, isInSession: %d",
796                         locEng->generateNmea, mLocation.position_source,
797                         locEng->engine_status, locEng->adapter->isInSession());
798 
799         if (locEng->generateNmea &&
800             locEng->adapter->isInSession())
801         {
802             unsigned char generate_nmea = reported &&
803                                           (mStatus != LOC_SESS_FAILURE);
804             loc_eng_nmea_generate_pos(locEng, mLocation, mLocationExtended,
805                                       generate_nmea);
806         }
807 
808         // Free the allocated memory for rawData
809         UlpLocation* gp = (UlpLocation*)&(mLocation);
810         if (gp != NULL && gp->rawData != NULL)
811         {
812             delete (char*)gp->rawData;
813             gp->rawData = NULL;
814             gp->rawDataSize = 0;
815         }
816     }
817 }
locallog() const818 void LocEngReportPosition::locallog() const {
819     LOC_LOGV("LocEngReportPosition");
820 }
log() const821 void LocEngReportPosition::log() const {
822     locallog();
823 }
send() const824 void LocEngReportPosition::send() const {
825     mAdapter->sendMsg(this);
826 }
827 
828 
829 //        case LOC_ENG_MSG_REPORT_SV:
LocEngReportSv(LocAdapterBase * adapter,QtiGnssSvStatus & sv,GpsLocationExtended & locExtended,void * svExt)830 LocEngReportSv::LocEngReportSv(LocAdapterBase* adapter,
831                                QtiGnssSvStatus &sv,
832                                GpsLocationExtended &locExtended,
833                                void* svExt) :
834     LocMsg(), mAdapter(adapter), mSvStatus(sv),
835     mLocationExtended(locExtended),
836     mSvExt(((loc_eng_data_s_type*)
837             ((LocEngAdapter*)
838              (mAdapter))->getOwner())->sv_ext_parser(svExt))
839 {
840     locallog();
841 }
proc() const842 void LocEngReportSv::proc() const {
843     LocEngAdapter* adapter = (LocEngAdapter*)mAdapter;
844     loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)adapter->getOwner();
845 
846     if (locEng->mute_session_state != LOC_MUTE_SESS_IN_SESSION)
847     {
848         if (locEng->sv_status_cb != NULL) {
849             locEng->sv_status_cb((GpsSvStatus*)&(mSvStatus),
850                                  (void*)mSvExt);
851         }
852 
853         if (locEng->generateNmea)
854         {
855             loc_eng_nmea_generate_sv(locEng, mSvStatus, mLocationExtended);
856         }
857     }
858 }
locallog() const859 void LocEngReportSv::locallog() const {
860     LOC_LOGV("%s:%d] LocEngReportSv",__func__, __LINE__);
861 }
log() const862 inline void LocEngReportSv::log() const {
863     locallog();
864 }
send() const865 void LocEngReportSv::send() const {
866     mAdapter->sendMsg(this);
867 }
868 
869 //        case LOC_ENG_MSG_REPORT_STATUS:
LocEngReportStatus(LocAdapterBase * adapter,GpsStatusValue engineStatus)870 LocEngReportStatus::LocEngReportStatus(LocAdapterBase* adapter,
871                                        GpsStatusValue engineStatus) :
872     LocMsg(),  mAdapter(adapter), mStatus(engineStatus)
873 {
874     locallog();
875 }
proc() const876 inline void LocEngReportStatus::proc() const
877 {
878     LocEngAdapter* adapter = (LocEngAdapter*)mAdapter;
879     loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)adapter->getOwner();
880 
881     loc_eng_report_status(*locEng, mStatus);
882     update_aiding_data_for_deletion(*locEng);
883 }
locallog() const884 inline void LocEngReportStatus::locallog() const {
885     LOC_LOGV("LocEngReportStatus");
886 }
log() const887 inline void LocEngReportStatus::log() const {
888     locallog();
889 }
890 
891 //        case LOC_ENG_MSG_REPORT_NMEA:
LocEngReportNmea(void * locEng,const char * data,int len)892 LocEngReportNmea::LocEngReportNmea(void* locEng,
893                                    const char* data, int len) :
894     LocMsg(), mLocEng(locEng), mNmea(new char[len]), mLen(len)
895 {
896     memcpy((void*)mNmea, (void*)data, len);
897     locallog();
898 }
proc() const899 void LocEngReportNmea::proc() const {
900     loc_eng_data_s_type* locEng = (loc_eng_data_s_type*) mLocEng;
901 
902     struct timeval tv;
903     gettimeofday(&tv, (struct timezone *) NULL);
904     int64_t now = tv.tv_sec * 1000LL + tv.tv_usec / 1000;
905 
906     if (locEng->nmea_cb != NULL)
907         locEng->nmea_cb(now, mNmea, mLen);
908 }
locallog() const909 inline void LocEngReportNmea::locallog() const {
910     LOC_LOGV("LocEngReportNmea");
911 }
log() const912 inline void LocEngReportNmea::log() const {
913     locallog();
914 }
915 
916 //        case LOC_ENG_MSG_REPORT_XTRA_SERVER:
LocEngReportXtraServer(void * locEng,const char * url1,const char * url2,const char * url3,const int maxlength)917 LocEngReportXtraServer::LocEngReportXtraServer(void* locEng,
918                                                const char *url1,
919                                                const char *url2,
920                                                const char *url3,
921                                                const int maxlength) :
922     LocMsg(), mLocEng(locEng), mMaxLen(maxlength),
923     mServers(new char[3*(mMaxLen+1)])
924 {
925     char * cptr = mServers;
926     memset(mServers, 0, 3*(mMaxLen+1));
927 
928     // Override modem URLs with uncommented gps.conf urls
929     if( gps_conf.XTRA_SERVER_1[0] != '\0' ) {
930         url1 = &gps_conf.XTRA_SERVER_1[0];
931     }
932     if( gps_conf.XTRA_SERVER_2[0] != '\0' ) {
933         url2 = &gps_conf.XTRA_SERVER_2[0];
934     }
935     if( gps_conf.XTRA_SERVER_3[0] != '\0' ) {
936         url3 = &gps_conf.XTRA_SERVER_3[0];
937     }
938     // copy non xtra1.gpsonextra.net URLs into the forwarding buffer.
939     if( NULL == strcasestr(url1, XTRA1_GPSONEXTRA) ) {
940         strlcpy(cptr, url1, mMaxLen + 1);
941         cptr += mMaxLen + 1;
942     }
943     if( NULL == strcasestr(url2, XTRA1_GPSONEXTRA) ) {
944         strlcpy(cptr, url2, mMaxLen + 1);
945         cptr += mMaxLen + 1;
946     }
947     if( NULL == strcasestr(url3, XTRA1_GPSONEXTRA) ) {
948         strlcpy(cptr, url3, mMaxLen + 1);
949     }
950     locallog();
951 }
952 
proc() const953 void LocEngReportXtraServer::proc() const {
954     loc_eng_xtra_data_s_type* locEngXtra =
955         &(((loc_eng_data_s_type*)mLocEng)->xtra_module_data);
956 
957     if (locEngXtra->report_xtra_server_cb != NULL) {
958         CALLBACK_LOG_CALLFLOW("report_xtra_server_cb", %s, mServers);
959         locEngXtra->report_xtra_server_cb(mServers,
960                                           &(mServers[mMaxLen+1]),
961                                           &(mServers[(mMaxLen+1)<<1]));
962     } else {
963         LOC_LOGE("Callback function for request xtra is NULL");
964     }
965 }
locallog() const966 inline void LocEngReportXtraServer::locallog() const {
967     LOC_LOGV("LocEngReportXtraServers: server1: %s\n  server2: %s\n"
968              "  server3: %s\n",
969              mServers, &mServers[mMaxLen+1], &mServers[(mMaxLen+1)<<1]);
970 }
log() const971 inline void LocEngReportXtraServer::log() const {
972     locallog();
973 }
974 
975 //        case LOC_ENG_MSG_REQUEST_BIT:
976 //        case LOC_ENG_MSG_RELEASE_BIT:
LocEngReqRelBIT(void * locEng,AGpsExtType type,int ipv4,char * ipv6,bool isReq)977 LocEngReqRelBIT::LocEngReqRelBIT(void* locEng, AGpsExtType type,
978                                  int ipv4, char* ipv6, bool isReq) :
979     LocMsg(), mLocEng(locEng), mType(type), mIPv4Addr(ipv4),
980     mIPv6Addr(ipv6 ? new char[16] : NULL), mIsReq(isReq) {
981     if (NULL != ipv6)
982         memcpy(mIPv6Addr, ipv6, 16);
983     locallog();
984 }
~LocEngReqRelBIT()985 inline LocEngReqRelBIT::~LocEngReqRelBIT() {
986     if (mIPv6Addr) {
987         delete[] mIPv6Addr;
988     }
989 }
proc() const990 void LocEngReqRelBIT::proc() const {
991     loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng;
992     BITSubscriber s(getAgpsStateMachine(*locEng, mType),
993                     mIPv4Addr, mIPv6Addr);
994     AgpsStateMachine* sm = (AgpsStateMachine*)s.mStateMachine;
995 
996     if (mIsReq) {
997         sm->subscribeRsrc((Subscriber*)&s);
998     } else {
999         sm->unsubscribeRsrc((Subscriber*)&s);
1000     }
1001 }
locallog() const1002 inline void LocEngReqRelBIT::locallog() const {
1003     LOC_LOGV("LocEngRequestBIT - ipv4: %d.%d.%d.%d, ipv6: %s",
1004              (unsigned char)mIPv4Addr,
1005              (unsigned char)(mIPv4Addr>>8),
1006              (unsigned char)(mIPv4Addr>>16),
1007              (unsigned char)(mIPv4Addr>>24),
1008              NULL != mIPv6Addr ? mIPv6Addr : "");
1009 }
log() const1010 inline void LocEngReqRelBIT::log() const {
1011     locallog();
1012 }
send() const1013 void LocEngReqRelBIT::send() const {
1014     loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng;
1015     locEng->adapter->sendMsg(this);
1016 }
1017 
1018 //        case LOC_ENG_MSG_RELEASE_BIT:
1019 struct LocEngReleaseBIT : public LocMsg {
1020     const BITSubscriber mSubscriber;
LocEngReleaseBITLocEngReleaseBIT1021     inline LocEngReleaseBIT(const AgpsStateMachine* stateMachine,
1022                             unsigned int ipv4, char* ipv6) :
1023         LocMsg(),
1024         mSubscriber(stateMachine, ipv4, ipv6)
1025     {
1026         locallog();
1027     }
procLocEngReleaseBIT1028     inline virtual void proc() const
1029     {
1030         AgpsStateMachine* sm = (AgpsStateMachine*)mSubscriber.mStateMachine;
1031         sm->unsubscribeRsrc((Subscriber*)&mSubscriber);
1032     }
locallogLocEngReleaseBIT1033     inline void locallog() const {
1034         LOC_LOGV("LocEngReleaseBIT - ipv4: %d.%d.%d.%d, ipv6: %s",
1035                  (unsigned char)(mSubscriber.ID>>24),
1036                  (unsigned char)(mSubscriber.ID>>16),
1037                  (unsigned char)(mSubscriber.ID>>8),
1038                  (unsigned char)mSubscriber.ID,
1039                  NULL != mSubscriber.mIPv6Addr ? mSubscriber.mIPv6Addr : "");
1040     }
logLocEngReleaseBIT1041     virtual void log() const {
1042         locallog();
1043     }
1044 };
1045 
1046 //        LocEngSuplEsOpened
LocEngSuplEsOpened(void * locEng)1047 LocEngSuplEsOpened::LocEngSuplEsOpened(void* locEng) :
1048     LocMsg(), mLocEng(locEng) {
1049     locallog();
1050 }
proc() const1051 void LocEngSuplEsOpened::proc() const {
1052     loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng;
1053     if (locEng->ds_nif) {
1054         AgpsStateMachine* sm = locEng->ds_nif;
1055         sm->onRsrcEvent(RSRC_GRANTED);
1056     }
1057 }
locallog() const1058 void LocEngSuplEsOpened::locallog() const {
1059     LOC_LOGV("LocEngSuplEsOpened");
1060 }
log() const1061 void LocEngSuplEsOpened::log() const {
1062     locallog();
1063 }
1064 
1065 //        LocEngSuplEsClosed
LocEngSuplEsClosed(void * locEng)1066 LocEngSuplEsClosed::LocEngSuplEsClosed(void* locEng) :
1067     LocMsg(), mLocEng(locEng) {
1068     locallog();
1069 }
proc() const1070 void LocEngSuplEsClosed::proc() const {
1071     loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng;
1072     if (locEng->ds_nif) {
1073         AgpsStateMachine* sm = locEng->ds_nif;
1074         sm->onRsrcEvent(RSRC_RELEASED);
1075     }
1076 }
locallog() const1077 void LocEngSuplEsClosed::locallog() const {
1078     LOC_LOGV("LocEngSuplEsClosed");
1079 }
log() const1080 void LocEngSuplEsClosed::log() const {
1081     locallog();
1082 }
1083 
1084 
1085 //        case LOC_ENG_MSG_REQUEST_SUPL_ES:
LocEngRequestSuplEs(void * locEng,int id)1086 LocEngRequestSuplEs::LocEngRequestSuplEs(void* locEng, int id) :
1087     LocMsg(), mLocEng(locEng), mID(id) {
1088     locallog();
1089 }
proc() const1090 void LocEngRequestSuplEs::proc() const {
1091     loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng;
1092     if (locEng->ds_nif) {
1093         AgpsStateMachine* sm = locEng->ds_nif;
1094         DSSubscriber s(sm, mID);
1095         sm->subscribeRsrc((Subscriber*)&s);
1096     }
1097     else if (locEng->agnss_nif) {
1098         AgpsStateMachine *sm = locEng->agnss_nif;
1099         ATLSubscriber s(mID,
1100                         sm,
1101                         locEng->adapter,
1102                         false);
1103         sm->subscribeRsrc((Subscriber*)&s);
1104         LOC_LOGD("%s:%d]: Using regular ATL for SUPL ES", __func__, __LINE__);
1105     }
1106     else {
1107         locEng->adapter->atlOpenStatus(mID, 0, NULL, -1, -1);
1108     }
1109 }
locallog() const1110 inline void LocEngRequestSuplEs::locallog() const {
1111     LOC_LOGV("LocEngRequestSuplEs");
1112 }
log() const1113 inline void LocEngRequestSuplEs::log() const {
1114     locallog();
1115 }
1116 
1117 //        case LOC_ENG_MSG_REQUEST_ATL:
LocEngRequestATL(void * locEng,int id,AGpsExtType agps_type)1118 LocEngRequestATL::LocEngRequestATL(void* locEng, int id,
1119                                    AGpsExtType agps_type) :
1120     LocMsg(), mLocEng(locEng), mID(id), mType(agps_type) {
1121     locallog();
1122 }
proc() const1123 void LocEngRequestATL::proc() const {
1124     loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng;
1125     AgpsStateMachine* sm = (AgpsStateMachine*)
1126                            getAgpsStateMachine(*locEng, mType);
1127     if (sm) {
1128         ATLSubscriber s(mID,
1129                         sm,
1130                         locEng->adapter,
1131                         AGPS_TYPE_INVALID == mType);
1132         sm->subscribeRsrc((Subscriber*)&s);
1133     } else {
1134         locEng->adapter->atlOpenStatus(mID, 0, NULL, -1, mType);
1135     }
1136 }
locallog() const1137 inline void LocEngRequestATL::locallog() const {
1138     LOC_LOGV("LocEngRequestATL");
1139 }
log() const1140 inline void LocEngRequestATL::log() const {
1141     locallog();
1142 }
1143 
1144 //        case LOC_ENG_MSG_RELEASE_ATL:
LocEngReleaseATL(void * locEng,int id)1145 LocEngReleaseATL::LocEngReleaseATL(void* locEng, int id) :
1146     LocMsg(), mLocEng(locEng), mID(id) {
1147     locallog();
1148 }
proc() const1149 void LocEngReleaseATL::proc() const {
1150     loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng;
1151 
1152    if (locEng->agnss_nif) {
1153         ATLSubscriber s1(mID, locEng->agnss_nif, locEng->adapter, false);
1154         if (locEng->agnss_nif->unsubscribeRsrc((Subscriber*)&s1)) {
1155             LOC_LOGD("%s:%d]: Unsubscribed from agnss_nif",
1156                      __func__, __LINE__);
1157             return;
1158         }
1159     }
1160 
1161     if (locEng->internet_nif) {
1162         ATLSubscriber s2(mID, locEng->internet_nif, locEng->adapter, false);
1163         if (locEng->internet_nif->unsubscribeRsrc((Subscriber*)&s2)) {
1164             LOC_LOGD("%s:%d]: Unsubscribed from internet_nif",
1165                      __func__, __LINE__);
1166             return;
1167         }
1168     }
1169 
1170     if (locEng->ds_nif) {
1171         DSSubscriber s3(locEng->ds_nif, mID);
1172         if (locEng->ds_nif->unsubscribeRsrc((Subscriber*)&s3)) {
1173             LOC_LOGD("%s:%d]: Unsubscribed from ds_nif",
1174                      __func__, __LINE__);
1175             return;
1176         }
1177     }
1178 
1179     LOC_LOGW("%s:%d]: Could not release ATL. "
1180              "No subscribers found\n",
1181              __func__, __LINE__);
1182     locEng->adapter->atlCloseStatus(mID, 0);
1183 }
locallog() const1184 inline void LocEngReleaseATL::locallog() const {
1185     LOC_LOGV("LocEngReleaseATL");
1186 }
log() const1187 inline void LocEngReleaseATL::log() const {
1188     locallog();
1189 }
1190 
1191 //        case LOC_ENG_MSG_REQUEST_WIFI:
1192 //        case LOC_ENG_MSG_RELEASE_WIFI:
LocEngReqRelWifi(void * locEng,AGpsExtType type,loc_if_req_sender_id_e_type sender_id,char * s,char * p,bool isReq)1193 LocEngReqRelWifi::LocEngReqRelWifi(void* locEng, AGpsExtType type,
1194                                    loc_if_req_sender_id_e_type sender_id,
1195                                    char* s, char* p, bool isReq) :
1196     LocMsg(), mLocEng(locEng), mType(type), mSenderId(sender_id),
1197     mSSID(NULL == s ? NULL : new char[SSID_BUF_SIZE]),
1198     mPassword(NULL == p ? NULL : new char[SSID_BUF_SIZE]),
1199     mIsReq(isReq) {
1200     if (NULL != s)
1201         strlcpy(mSSID, s, SSID_BUF_SIZE);
1202     if (NULL != p)
1203         strlcpy(mPassword, p, SSID_BUF_SIZE);
1204     locallog();
1205 }
~LocEngReqRelWifi()1206 LocEngReqRelWifi::~LocEngReqRelWifi() {
1207     if (NULL != mSSID) {
1208         delete[] mSSID;
1209     }
1210     if (NULL != mPassword) {
1211         delete[] mPassword;
1212     }
1213 }
proc() const1214 void LocEngReqRelWifi::proc() const {
1215     loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng;
1216     if (locEng->wifi_nif) {
1217         WIFISubscriber s(locEng->wifi_nif, mSSID, mPassword, mSenderId);
1218         if (mIsReq) {
1219             locEng->wifi_nif->subscribeRsrc((Subscriber*)&s);
1220         } else {
1221             locEng->wifi_nif->unsubscribeRsrc((Subscriber*)&s);
1222         }
1223     } else {
1224         locEng->adapter->atlOpenStatus(mSenderId, 0, NULL, -1, mType);
1225     }
1226 }
locallog() const1227 inline void LocEngReqRelWifi::locallog() const {
1228     LOC_LOGV("%s - senderId: %d, ssid: %s, password: %s",
1229              mIsReq ? "LocEngRequestWifi" : "LocEngReleaseWifi",
1230              mSenderId,
1231              NULL != mSSID ? mSSID : "",
1232              NULL != mPassword ? mPassword : "");
1233 }
log() const1234 inline void LocEngReqRelWifi::log() const {
1235     locallog();
1236 }
send() const1237 void LocEngReqRelWifi::send() const {
1238     loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng;
1239     locEng->adapter->sendMsg(this);
1240 }
1241 
1242 //        case LOC_ENG_MSG_REQUEST_XTRA_DATA:
LocEngRequestXtra(void * locEng)1243 LocEngRequestXtra::LocEngRequestXtra(void* locEng) :
1244     mLocEng(locEng) {
1245     locallog();
1246 }
proc() const1247 void LocEngRequestXtra::proc() const
1248 {
1249     loc_eng_xtra_data_s_type* locEngXtra =
1250         &(((loc_eng_data_s_type*)mLocEng)->xtra_module_data);
1251 
1252     if (locEngXtra->download_request_cb != NULL) {
1253         CALLBACK_LOG_CALLFLOW("download_request_cb", %p, mLocEng);
1254         locEngXtra->download_request_cb();
1255     } else {
1256         LOC_LOGE("Callback function for request xtra is NULL");
1257     }
1258 }
locallog() const1259 inline void LocEngRequestXtra::locallog() const {
1260     LOC_LOGV("LocEngReqXtra");
1261 }
log() const1262 inline void LocEngRequestXtra::log() const {
1263     locallog();
1264 }
1265 
1266 //        case LOC_ENG_MSG_REQUEST_TIME:
LocEngRequestTime(void * locEng)1267 LocEngRequestTime::LocEngRequestTime(void* locEng) :
1268     LocMsg(), mLocEng(locEng)
1269 {
1270     locallog();
1271 }
proc() const1272 void LocEngRequestTime::proc() const {
1273     loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng;
1274     if (gps_conf.CAPABILITIES & GPS_CAPABILITY_ON_DEMAND_TIME) {
1275         if (locEng->request_utc_time_cb != NULL) {
1276             locEng->request_utc_time_cb();
1277         } else {
1278             LOC_LOGE("Callback function for request time is NULL");
1279         }
1280     }
1281 }
locallog() const1282 inline void LocEngRequestTime::locallog() const {
1283     LOC_LOGV("LocEngReqTime");
1284 }
log() const1285 inline void LocEngRequestTime::log() const {
1286     locallog();
1287 }
1288 
1289 //        case LOC_ENG_MSG_DELETE_AIDING_DATA:
1290 struct LocEngDelAidData : public LocMsg {
1291     loc_eng_data_s_type* mLocEng;
1292     const GpsAidingData mType;
LocEngDelAidDataLocEngDelAidData1293     inline LocEngDelAidData(loc_eng_data_s_type* locEng,
1294                             GpsAidingData f) :
1295         LocMsg(), mLocEng(locEng), mType(f)
1296     {
1297         locallog();
1298     }
procLocEngDelAidData1299     inline virtual void proc() const {
1300         mLocEng->aiding_data_for_deletion = mType;
1301         update_aiding_data_for_deletion(*mLocEng);
1302     }
locallogLocEngDelAidData1303     inline void locallog() const {
1304         LOC_LOGV("aiding data msak %d", mType);
1305     }
logLocEngDelAidData1306     virtual void log() const {
1307         locallog();
1308     }
1309 };
1310 
1311 //        case LOC_ENG_MSG_ENABLE_DATA:
1312 struct LocEngEnableData : public LocMsg {
1313     LocEngAdapter* mAdapter;
1314     const int mEnable;
1315     char* mAPN;
1316     const int mLen;
LocEngEnableDataLocEngEnableData1317     inline LocEngEnableData(LocEngAdapter* adapter,
1318                             const char* name, int len, int enable) :
1319         LocMsg(), mAdapter(adapter),
1320         mEnable(enable), mAPN(NULL), mLen(len)
1321     {
1322         if (NULL != name) {
1323             mAPN = new char[len+1];
1324             memcpy((void*)mAPN, (void*)name, len);
1325             mAPN[len] = 0;
1326         }
1327         locallog();
1328     }
~LocEngEnableDataLocEngEnableData1329     inline ~LocEngEnableData() {
1330         if (NULL != mAPN) {
1331             delete[] mAPN;
1332         }
1333     }
procLocEngEnableData1334     inline virtual void proc() const {
1335         mAdapter->enableData(mEnable);
1336         if (NULL != mAPN) {
1337             mAdapter->setAPN(mAPN, mLen);
1338         }
1339     }
locallogLocEngEnableData1340     inline void locallog() const {
1341         LOC_LOGV("apn: %s\n  enable: %d",
1342                  (NULL == mAPN) ? "NULL" : mAPN, mEnable);
1343     }
logLocEngEnableData1344     inline virtual void log() const {
1345         locallog();
1346     }
1347 };
1348 
1349 //        case LOC_ENG_MSG_INJECT_XTRA_DATA:
1350 // loc_eng_xtra.cpp
1351 
1352 //        case LOC_ENG_MSG_SET_CAPABILITIES:
1353 struct LocEngSetCapabilities : public LocMsg {
1354     loc_eng_data_s_type* mLocEng;
LocEngSetCapabilitiesLocEngSetCapabilities1355     inline LocEngSetCapabilities(loc_eng_data_s_type* locEng) :
1356         LocMsg(), mLocEng(locEng)
1357     {
1358         locallog();
1359     }
procLocEngSetCapabilities1360     inline virtual void proc() const {
1361         if (NULL != mLocEng->set_capabilities_cb) {
1362             LOC_LOGV("calling set_capabilities_cb 0x%x",
1363                      gps_conf.CAPABILITIES);
1364             mLocEng->set_capabilities_cb(gps_conf.CAPABILITIES);
1365         } else {
1366             LOC_LOGV("set_capabilities_cb is NULL.\n");
1367         }
1368     }
locallogLocEngSetCapabilities1369     inline void locallog() const
1370     {
1371         LOC_LOGV("LocEngSetCapabilities");
1372     }
logLocEngSetCapabilities1373     inline virtual void log() const
1374     {
1375         locallog();
1376     }
1377 };
1378 
1379 //        case LOC_ENG_MSG_LOC_INIT:
1380 struct LocEngInit : public LocMsg {
1381     loc_eng_data_s_type* mLocEng;
LocEngInitLocEngInit1382     inline LocEngInit(loc_eng_data_s_type* locEng) :
1383         LocMsg(), mLocEng(locEng)
1384     {
1385         locallog();
1386     }
procLocEngInit1387     inline virtual void proc() const {
1388         loc_eng_reinit(*mLocEng);
1389         // set the capabilities
1390         mLocEng->adapter->sendMsg(new LocEngSetCapabilities(mLocEng));
1391     }
locallogLocEngInit1392     inline void locallog() const
1393     {
1394         LOC_LOGV("LocEngInit");
1395     }
logLocEngInit1396     inline virtual void log() const
1397     {
1398         locallog();
1399     }
1400 };
1401 
1402 //        case LOC_ENG_MSG_REQUEST_XTRA_SERVER:
1403 // loc_eng_xtra.cpp
1404 
1405 //        case LOC_ENG_MSG_ATL_OPEN_SUCCESS:
1406 struct LocEngAtlOpenSuccess : public LocMsg {
1407     AgpsStateMachine* mStateMachine;
1408     const int mLen;
1409     char* mAPN;
1410     const AGpsBearerType mBearerType;
LocEngAtlOpenSuccessLocEngAtlOpenSuccess1411     inline LocEngAtlOpenSuccess(AgpsStateMachine* statemachine,
1412                                 const char* name,
1413                                 int len,
1414                                 AGpsBearerType btype) :
1415         LocMsg(),
1416         mStateMachine(statemachine), mLen(len),
1417         mAPN(new char[len+1]), mBearerType(btype)
1418     {
1419         memcpy((void*)mAPN, (void*)name, len);
1420         mAPN[len] = 0;
1421         locallog();
1422     }
~LocEngAtlOpenSuccessLocEngAtlOpenSuccess1423     inline ~LocEngAtlOpenSuccess()
1424     {
1425         delete[] mAPN;
1426     }
procLocEngAtlOpenSuccess1427     inline virtual void proc() const {
1428         mStateMachine->setBearer(mBearerType);
1429         mStateMachine->setAPN(mAPN, mLen);
1430         mStateMachine->onRsrcEvent(RSRC_GRANTED);
1431     }
locallogLocEngAtlOpenSuccess1432     inline void locallog() const {
1433         LOC_LOGV("LocEngAtlOpenSuccess agps type: %s\n  apn: %s\n"
1434                  "  bearer type: %s",
1435                  loc_get_agps_type_name(mStateMachine->getType()),
1436                  mAPN,
1437                  loc_get_agps_bear_name(mBearerType));
1438     }
logLocEngAtlOpenSuccess1439     inline virtual void log() const {
1440         locallog();
1441     }
1442 };
1443 
1444 //        case LOC_ENG_MSG_ATL_CLOSED:
1445 struct LocEngAtlClosed : public LocMsg {
1446     AgpsStateMachine* mStateMachine;
LocEngAtlClosedLocEngAtlClosed1447     inline LocEngAtlClosed(AgpsStateMachine* statemachine) :
1448         LocMsg(), mStateMachine(statemachine) {
1449         locallog();
1450     }
procLocEngAtlClosed1451     inline virtual void proc() const {
1452         mStateMachine->onRsrcEvent(RSRC_RELEASED);
1453     }
locallogLocEngAtlClosed1454     inline void locallog() const {
1455         LOC_LOGV("LocEngAtlClosed");
1456     }
logLocEngAtlClosed1457     inline virtual void log() const {
1458         locallog();
1459     }
1460 };
1461 
1462 //        case LOC_ENG_MSG_ATL_OPEN_FAILED:
1463 struct LocEngAtlOpenFailed : public LocMsg {
1464     AgpsStateMachine* mStateMachine;
LocEngAtlOpenFailedLocEngAtlOpenFailed1465     inline LocEngAtlOpenFailed(AgpsStateMachine* statemachine) :
1466         LocMsg(), mStateMachine(statemachine) {
1467         locallog();
1468     }
procLocEngAtlOpenFailed1469     inline virtual void proc() const {
1470         mStateMachine->onRsrcEvent(RSRC_DENIED);
1471     }
locallogLocEngAtlOpenFailed1472     inline void locallog() const {
1473         LOC_LOGV("LocEngAtlOpenFailed");
1474     }
logLocEngAtlOpenFailed1475     inline virtual void log() const {
1476         locallog();
1477     }
1478 };
1479 
1480 //        case LOC_ENG_MSG_ENGINE_DOWN:
LocEngDown(void * locEng)1481 LocEngDown::LocEngDown(void* locEng) :
1482     LocMsg(), mLocEng(locEng) {
1483     locallog();
1484 }
proc() const1485 inline void LocEngDown::proc() const {
1486     loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng;
1487     loc_eng_handle_engine_down(*locEng);
1488 }
locallog() const1489 inline void LocEngDown::locallog() const {
1490     LOC_LOGV("LocEngDown");
1491 }
log() const1492 inline void LocEngDown::log() const {
1493     locallog();
1494 }
1495 
1496 //        case LOC_ENG_MSG_ENGINE_UP:
LocEngUp(void * locEng)1497 LocEngUp::LocEngUp(void* locEng) :
1498     LocMsg(), mLocEng(locEng) {
1499     locallog();
1500 }
proc() const1501 inline void LocEngUp::proc() const {
1502     loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng;
1503     loc_eng_handle_engine_up(*locEng);
1504 }
locallog() const1505 inline void LocEngUp::locallog() const {
1506     LOC_LOGV("LocEngUp");
1507 }
log() const1508 inline void LocEngUp::log() const {
1509     locallog();
1510 }
1511 
1512 struct LocEngDataClientInit : public LocMsg {
1513     loc_eng_data_s_type* mLocEng;
LocEngDataClientInitLocEngDataClientInit1514     inline LocEngDataClientInit(loc_eng_data_s_type* locEng) :
1515         LocMsg(), mLocEng(locEng) {
1516         locallog();
1517     }
procLocEngDataClientInit1518     virtual void proc() const {
1519         loc_eng_data_s_type *locEng = (loc_eng_data_s_type *)mLocEng;
1520         if(!locEng->adapter->initDataServiceClient()) {
1521             locEng->ds_nif = new DSStateMachine(servicerTypeExt,
1522                                                (void *)dataCallCb,
1523                                                locEng->adapter);
1524         }
1525     }
locallogLocEngDataClientInit1526     void locallog() const {
1527         LOC_LOGV("LocEngDataClientInit\n");
1528     }
logLocEngDataClientInit1529     virtual void log() const {
1530         locallog();
1531     }
1532 };
1533 
1534 struct LocEngInstallAGpsCert : public LocMsg {
1535     LocEngAdapter* mpAdapter;
1536     const size_t mNumberOfCerts;
1537     const uint32_t mSlotBitMask;
1538     DerEncodedCertificate* mpData;
LocEngInstallAGpsCertLocEngInstallAGpsCert1539     inline LocEngInstallAGpsCert(LocEngAdapter* adapter,
1540                               const DerEncodedCertificate* pData,
1541                               size_t numberOfCerts,
1542                               uint32_t slotBitMask) :
1543         LocMsg(), mpAdapter(adapter),
1544         mNumberOfCerts(numberOfCerts), mSlotBitMask(slotBitMask),
1545         mpData(new DerEncodedCertificate[mNumberOfCerts])
1546     {
1547         for (int i=0; i < mNumberOfCerts; i++) {
1548             mpData[i].data = new u_char[pData[i].length];
1549             if (mpData[i].data) {
1550                 memcpy(mpData[i].data, (void*)pData[i].data, pData[i].length);
1551                 mpData[i].length = pData[i].length;
1552             } else {
1553                 LOC_LOGE("malloc failed for cert#%d", i);
1554                 break;
1555             }
1556         }
1557         locallog();
1558     }
~LocEngInstallAGpsCertLocEngInstallAGpsCert1559     inline ~LocEngInstallAGpsCert()
1560     {
1561         for (int i=0; i < mNumberOfCerts; i++) {
1562             if (mpData[i].data) {
1563                 delete[] mpData[i].data;
1564             }
1565         }
1566         delete[] mpData;
1567     }
procLocEngInstallAGpsCert1568     inline virtual void proc() const {
1569         mpAdapter->installAGpsCert(mpData, mNumberOfCerts, mSlotBitMask);
1570     }
locallogLocEngInstallAGpsCert1571     inline void locallog() const {
1572         LOC_LOGV("LocEngInstallAGpsCert - certs=%u mask=%u",
1573                  mNumberOfCerts, mSlotBitMask);
1574     }
logLocEngInstallAGpsCert1575     inline virtual void log() const {
1576         locallog();
1577     }
1578 };
1579 
1580 struct LocEngUpdateRegistrationMask : public LocMsg {
1581     loc_eng_data_s_type* mLocEng;
1582     LOC_API_ADAPTER_EVENT_MASK_T mMask;
1583     loc_registration_mask_status mIsEnabled;
LocEngUpdateRegistrationMaskLocEngUpdateRegistrationMask1584     inline LocEngUpdateRegistrationMask(loc_eng_data_s_type* locEng,
1585                                         LOC_API_ADAPTER_EVENT_MASK_T mask,
1586                                         loc_registration_mask_status isEnabled) :
1587         LocMsg(), mLocEng(locEng), mMask(mask), mIsEnabled(isEnabled) {
1588         locallog();
1589     }
procLocEngUpdateRegistrationMask1590     inline virtual void proc() const {
1591         loc_eng_data_s_type *locEng = (loc_eng_data_s_type *)mLocEng;
1592         locEng->adapter->updateRegistrationMask(mMask,
1593                                                 mIsEnabled);
1594     }
locallogLocEngUpdateRegistrationMask1595     void locallog() const {
1596         LOC_LOGV("LocEngUpdateRegistrationMask\n");
1597     }
logLocEngUpdateRegistrationMask1598     virtual void log() const {
1599         locallog();
1600     }
1601 };
1602 
1603 struct LocEngGnssConstellationConfig : public LocMsg {
1604     LocEngAdapter* mAdapter;
LocEngGnssConstellationConfigLocEngGnssConstellationConfig1605     inline LocEngGnssConstellationConfig(LocEngAdapter* adapter) :
1606         LocMsg(), mAdapter(adapter) {
1607         locallog();
1608     }
procLocEngGnssConstellationConfig1609     inline virtual void proc() const {
1610         if (mAdapter->gnssConstellationConfig()) {
1611             LOC_LOGV("Modem supports GNSS measurements\n");
1612             gps_conf.CAPABILITIES |= GPS_CAPABILITY_MEASUREMENTS;
1613         } else {
1614             LOC_LOGV("Modem does not support GNSS measurements\n");
1615         }
1616     }
locallogLocEngGnssConstellationConfig1617     void locallog() const {
1618         LOC_LOGV("LocEngGnssConstellationConfig\n");
1619     }
logLocEngGnssConstellationConfig1620     virtual void log() const {
1621         locallog();
1622     }
1623 };
1624 
1625 //        case LOC_ENG_MSG_REPORT_GNSS_MEASUREMENT:
LocEngReportGpsMeasurement(void * locEng,GpsData & gpsData)1626 LocEngReportGpsMeasurement::LocEngReportGpsMeasurement(void* locEng,
1627                                                        GpsData &gpsData) :
1628     LocMsg(), mLocEng(locEng), mGpsData(gpsData)
1629 {
1630     locallog();
1631 }
proc() const1632 void LocEngReportGpsMeasurement::proc() const {
1633     loc_eng_data_s_type* locEng = (loc_eng_data_s_type*) mLocEng;
1634     if (locEng->mute_session_state != LOC_MUTE_SESS_IN_SESSION)
1635     {
1636         if (locEng->gps_measurement_cb != NULL) {
1637             locEng->gps_measurement_cb((GpsData*)&(mGpsData));
1638         }
1639     }
1640 }
locallog() const1641 void LocEngReportGpsMeasurement::locallog() const {
1642     IF_LOC_LOGV {
1643         LOC_LOGV("%s:%d]: Received in GPS HAL."
1644                  "GNSS Measurements count: %d \n",
1645                  __func__, __LINE__, mGpsData.measurement_count);
1646         for (int i =0; i< mGpsData.measurement_count && i < GPS_MAX_SVS; i++) {
1647                 LOC_LOGV(" GNSS measurement data in GPS HAL: \n"
1648                          " GPS_HAL => Measurement ID | prn | time_offset_ns | state |"
1649                          " received_gps_tow_ns| c_n0_dbhz | pseudorange_rate_mps |"
1650                          " pseudorange_rate_uncertainty_mps |"
1651                          " accumulated_delta_range_state | flags \n"
1652                          " GPS_HAL => %d | %d | %f | %d | %lld | %f | %f | %f | %d | %d \n",
1653                          i,
1654                          mGpsData.measurements[i].prn,
1655                          mGpsData.measurements[i].time_offset_ns,
1656                          mGpsData.measurements[i].state,
1657                          mGpsData.measurements[i].received_gps_tow_ns,
1658                          mGpsData.measurements[i].c_n0_dbhz,
1659                          mGpsData.measurements[i].pseudorange_rate_mps,
1660                          mGpsData.measurements[i].pseudorange_rate_uncertainty_mps,
1661                          mGpsData.measurements[i].accumulated_delta_range_state,
1662                          mGpsData.measurements[i].flags);
1663         }
1664         LOC_LOGV(" GPS_HAL => Clocks Info: type | time_ns \n"
1665                  " GPS_HAL => Clocks Info: %d | %lld", mGpsData.clock.type,
1666                  mGpsData.clock.time_ns);
1667     }
1668 }
log() const1669 inline void LocEngReportGpsMeasurement::log() const {
1670     locallog();
1671 }
1672 
1673 /*********************************************************************
1674  * Initialization checking macros
1675  *********************************************************************/
1676 #define STATE_CHECK(ctx, x, ret) \
1677     if (!(ctx))                  \
1678   {                              \
1679       /* Not intialized, abort */\
1680       LOC_LOGE("%s: log_eng state error: %s", __func__, x); \
1681       EXIT_LOG(%s, x);                                            \
1682       ret;                                                        \
1683   }
1684 #define INIT_CHECK(ctx, ret) STATE_CHECK(ctx, "instance not initialized", ret)
1685 
getCarrierCapabilities()1686 uint32_t getCarrierCapabilities() {
1687     #define carrierMSA (uint32_t)0x2
1688     #define carrierMSB (uint32_t)0x1
1689     #define gpsConfMSA (uint32_t)0x4
1690     #define gpsConfMSB (uint32_t)0x2
1691     uint32_t capabilities = gps_conf.CAPABILITIES;
1692     if ((gps_conf.SUPL_MODE & carrierMSA) != carrierMSA) {
1693         capabilities &= ~gpsConfMSA;
1694     }
1695     if ((gps_conf.SUPL_MODE & carrierMSB) != carrierMSB) {
1696         capabilities &= ~gpsConfMSB;
1697     }
1698 
1699     LOC_LOGV("getCarrierCapabilities: CAPABILITIES %x, SUPL_MODE %x, carrier capabilities %x",
1700              gps_conf.CAPABILITIES, gps_conf.SUPL_MODE, capabilities);
1701     return capabilities;
1702 }
1703 
1704 /*===========================================================================
1705 FUNCTION    loc_eng_init
1706 
1707 DESCRIPTION
1708    Initialize the location engine, this include setting up global datas
1709    and registers location engien with loc api service.
1710 
1711 DEPENDENCIES
1712    None
1713 
1714 RETURN VALUE
1715    0: success
1716 
1717 SIDE EFFECTS
1718    N/A
1719 
1720 ===========================================================================*/
loc_eng_init(loc_eng_data_s_type & loc_eng_data,LocCallbacks * callbacks,LOC_API_ADAPTER_EVENT_MASK_T event,ContextBase * context)1721 int loc_eng_init(loc_eng_data_s_type &loc_eng_data, LocCallbacks* callbacks,
1722                  LOC_API_ADAPTER_EVENT_MASK_T event, ContextBase* context)
1723 
1724 {
1725     int ret_val = 0;
1726 
1727     ENTRY_LOG_CALLFLOW();
1728     if (NULL == callbacks || 0 == event) {
1729         LOC_LOGE("loc_eng_init: bad parameters cb %p eMask %d", callbacks, event);
1730         ret_val = -1;
1731         EXIT_LOG(%d, ret_val);
1732         return ret_val;
1733     }
1734 
1735     STATE_CHECK((NULL == loc_eng_data.adapter),
1736                 "instance already initialized", return 0);
1737 
1738     memset(&loc_eng_data, 0, sizeof (loc_eng_data));
1739 
1740     // Save callbacks
1741     loc_eng_data.location_cb  = callbacks->location_cb;
1742     loc_eng_data.sv_status_cb = callbacks->sv_status_cb;
1743     loc_eng_data.status_cb    = callbacks->status_cb;
1744     loc_eng_data.nmea_cb      = callbacks->nmea_cb;
1745     loc_eng_data.set_capabilities_cb = callbacks->set_capabilities_cb;
1746     loc_eng_data.acquire_wakelock_cb = callbacks->acquire_wakelock_cb;
1747     loc_eng_data.release_wakelock_cb = callbacks->release_wakelock_cb;
1748     loc_eng_data.request_utc_time_cb = callbacks->request_utc_time_cb;
1749     loc_eng_data.location_ext_parser = callbacks->location_ext_parser ?
1750         callbacks->location_ext_parser : noProc;
1751     loc_eng_data.sv_ext_parser = callbacks->sv_ext_parser ?
1752         callbacks->sv_ext_parser : noProc;
1753     loc_eng_data.intermediateFix = gps_conf.INTERMEDIATE_POS;
1754     // initial states taken care of by the memset above
1755     // loc_eng_data.engine_status -- GPS_STATUS_NONE;
1756     // loc_eng_data.fix_session_status -- GPS_STATUS_NONE;
1757     // loc_eng_data.mute_session_state -- LOC_MUTE_SESS_NONE;
1758 
1759     if ((event & LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT) && (gps_conf.NMEA_PROVIDER == NMEA_PROVIDER_AP))
1760     {
1761         event = event ^ LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT; // unregister for modem NMEA report
1762         loc_eng_data.generateNmea = true;
1763     }
1764     else
1765     {
1766         loc_eng_data.generateNmea = false;
1767     }
1768 
1769     loc_eng_data.adapter =
1770         new LocEngAdapter(event, &loc_eng_data, context,
1771                           (LocThread::tCreate)callbacks->create_thread_cb);
1772 
1773     LOC_LOGD("loc_eng_init created client, id = %p\n",
1774              loc_eng_data.adapter);
1775     loc_eng_data.adapter->sendMsg(new LocEngInit(&loc_eng_data));
1776 
1777     EXIT_LOG(%d, ret_val);
1778     return ret_val;
1779 }
1780 
loc_eng_reinit(loc_eng_data_s_type & loc_eng_data)1781 static int loc_eng_reinit(loc_eng_data_s_type &loc_eng_data)
1782 {
1783     ENTRY_LOG();
1784     int ret_val = LOC_API_ADAPTER_ERR_SUCCESS;
1785     LocEngAdapter* adapter = loc_eng_data.adapter;
1786 
1787     adapter->sendMsg(new LocEngGnssConstellationConfig(adapter));
1788     adapter->sendMsg(new LocEngSuplVer(adapter, gps_conf.SUPL_VER));
1789     adapter->sendMsg(new LocEngLppConfig(adapter, gps_conf.LPP_PROFILE));
1790     adapter->sendMsg(new LocEngSensorControlConfig(adapter, sap_conf.SENSOR_USAGE,
1791                                                    sap_conf.SENSOR_PROVIDER));
1792     adapter->sendMsg(new LocEngAGlonassProtocol(adapter, gps_conf.A_GLONASS_POS_PROTOCOL_SELECT));
1793 
1794     /* Make sure at least one of the sensor property is specified by the user in the gps.conf file. */
1795     if( sap_conf.GYRO_BIAS_RANDOM_WALK_VALID ||
1796         sap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID ||
1797         sap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID ||
1798         sap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID ||
1799         sap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID ) {
1800         adapter->sendMsg(new LocEngSensorProperties(adapter,
1801                                                     sap_conf.GYRO_BIAS_RANDOM_WALK_VALID,
1802                                                     sap_conf.GYRO_BIAS_RANDOM_WALK,
1803                                                     sap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID,
1804                                                     sap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY,
1805                                                     sap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID,
1806                                                     sap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY,
1807                                                     sap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID,
1808                                                     sap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY,
1809                                                     sap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID,
1810                                                     sap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY));
1811     }
1812 
1813     adapter->sendMsg(new LocEngSensorPerfControlConfig(adapter,
1814                                                        sap_conf.SENSOR_CONTROL_MODE,
1815                                                        sap_conf.SENSOR_ACCEL_SAMPLES_PER_BATCH,
1816                                                        sap_conf.SENSOR_ACCEL_BATCHES_PER_SEC,
1817                                                        sap_conf.SENSOR_GYRO_SAMPLES_PER_BATCH,
1818                                                        sap_conf.SENSOR_GYRO_BATCHES_PER_SEC,
1819                                                        sap_conf.SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH,
1820                                                        sap_conf.SENSOR_ACCEL_BATCHES_PER_SEC_HIGH,
1821                                                        sap_conf.SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH,
1822                                                        sap_conf.SENSOR_GYRO_BATCHES_PER_SEC_HIGH,
1823                                                        sap_conf.SENSOR_ALGORITHM_CONFIG_MASK));
1824 
1825     adapter->sendMsg(new LocEngEnableData(adapter, NULL, 0, (agpsStatus ? 1:0)));
1826 
1827     loc_eng_xtra_version_check(loc_eng_data, gps_conf.XTRA_VERSION_CHECK);
1828 
1829     LOC_LOGD("loc_eng_reinit reinit() successful");
1830     EXIT_LOG(%d, ret_val);
1831     return ret_val;
1832 }
1833 
1834 /*===========================================================================
1835 FUNCTION    loc_eng_cleanup
1836 
1837 DESCRIPTION
1838    Cleans location engine. The location client handle will be released.
1839 
1840 DEPENDENCIES
1841    None
1842 
1843 RETURN VALUE
1844    None
1845 
1846 SIDE EFFECTS
1847    N/A
1848 
1849 ===========================================================================*/
loc_eng_cleanup(loc_eng_data_s_type & loc_eng_data)1850 void loc_eng_cleanup(loc_eng_data_s_type &loc_eng_data)
1851 {
1852     ENTRY_LOG_CALLFLOW();
1853     INIT_CHECK(loc_eng_data.adapter, return);
1854 
1855     // XTRA has no state, so we are fine with it.
1856 
1857     // we need to check and clear NI
1858 #if 0
1859     // we need to check and clear ATL
1860     if (NULL != loc_eng_data.agnss_nif) {
1861         delete loc_eng_data.agnss_nif;
1862         loc_eng_data.agnss_nif = NULL;
1863     }
1864     if (NULL != loc_eng_data.internet_nif) {
1865         delete loc_eng_data.internet_nif;
1866         loc_eng_data.internet_nif = NULL;
1867     }
1868 #endif
1869     if (loc_eng_data.adapter->isInSession())
1870     {
1871         LOC_LOGD("loc_eng_cleanup: fix not stopped. stop it now.");
1872         loc_eng_stop(loc_eng_data);
1873     }
1874 
1875 #if 0 // can't afford to actually clean up, for many reason.
1876 
1877     LOC_LOGD("loc_eng_init: client opened. close it now.");
1878     delete loc_eng_data.adapter;
1879     loc_eng_data.adapter = NULL;
1880 
1881     loc_eng_dmn_conn_loc_api_server_unblock();
1882     loc_eng_dmn_conn_loc_api_server_join();
1883 
1884 #endif
1885 
1886     EXIT_LOG(%s, VOID_RET);
1887 }
1888 
1889 
1890 /*===========================================================================
1891 FUNCTION    loc_eng_start
1892 
1893 DESCRIPTION
1894    Starts the tracking session
1895 
1896 DEPENDENCIES
1897    None
1898 
1899 RETURN VALUE
1900    0: success
1901 
1902 SIDE EFFECTS
1903    N/A
1904 
1905 ===========================================================================*/
loc_eng_start(loc_eng_data_s_type & loc_eng_data)1906 int loc_eng_start(loc_eng_data_s_type &loc_eng_data)
1907 {
1908    ENTRY_LOG_CALLFLOW();
1909    INIT_CHECK(loc_eng_data.adapter, return -1);
1910 
1911    if(! loc_eng_data.adapter->getUlpProxy()->sendStartFix())
1912    {
1913        loc_eng_data.adapter->sendMsg(new LocEngStartFix(loc_eng_data.adapter));
1914    }
1915 
1916    EXIT_LOG(%d, 0);
1917    return 0;
1918 }
1919 
loc_eng_start_handler(loc_eng_data_s_type & loc_eng_data)1920 static int loc_eng_start_handler(loc_eng_data_s_type &loc_eng_data)
1921 {
1922    ENTRY_LOG();
1923    int ret_val = LOC_API_ADAPTER_ERR_SUCCESS;
1924 
1925    if (!loc_eng_data.adapter->isInSession()) {
1926        ret_val = loc_eng_data.adapter->startFix();
1927 
1928        if (ret_val == LOC_API_ADAPTER_ERR_SUCCESS ||
1929            ret_val == LOC_API_ADAPTER_ERR_ENGINE_DOWN ||
1930            ret_val == LOC_API_ADAPTER_ERR_PHONE_OFFLINE ||
1931            ret_val == LOC_API_ADAPTER_ERR_INTERNAL)
1932        {
1933            loc_eng_data.adapter->setInSession(TRUE);
1934        }
1935    }
1936 
1937    EXIT_LOG(%d, ret_val);
1938    return ret_val;
1939 }
1940 
1941 /*===========================================================================
1942 FUNCTION    loc_eng_stop_wrapper
1943 
1944 DESCRIPTION
1945    Stops the tracking session
1946 
1947 DEPENDENCIES
1948    None
1949 
1950 RETURN VALUE
1951    0: success
1952 
1953 SIDE EFFECTS
1954    N/A
1955 
1956 ===========================================================================*/
loc_eng_stop(loc_eng_data_s_type & loc_eng_data)1957 int loc_eng_stop(loc_eng_data_s_type &loc_eng_data)
1958 {
1959     ENTRY_LOG_CALLFLOW();
1960     INIT_CHECK(loc_eng_data.adapter, return -1);
1961 
1962     if(! loc_eng_data.adapter->getUlpProxy()->sendStopFix())
1963     {
1964         loc_eng_data.adapter->sendMsg(new LocEngStopFix(loc_eng_data.adapter));
1965     }
1966 
1967     EXIT_LOG(%d, 0);
1968     return 0;
1969 }
1970 
loc_eng_stop_handler(loc_eng_data_s_type & loc_eng_data)1971 static int loc_eng_stop_handler(loc_eng_data_s_type &loc_eng_data)
1972 {
1973    ENTRY_LOG();
1974    int ret_val = LOC_API_ADAPTER_ERR_SUCCESS;
1975 
1976    if (loc_eng_data.adapter->isInSession()) {
1977 
1978        ret_val = loc_eng_data.adapter->stopFix();
1979        loc_eng_data.adapter->setInSession(FALSE);
1980    }
1981 
1982     EXIT_LOG(%d, ret_val);
1983     return ret_val;
1984 }
1985 
1986 /*===========================================================================
1987 FUNCTION    loc_eng_mute_one_session
1988 
1989 DESCRIPTION
1990    Mutes one session
1991 
1992 DEPENDENCIES
1993    None
1994 
1995 RETURN VALUE
1996    0: Success
1997 
1998 SIDE EFFECTS
1999    N/A
2000 
2001 ===========================================================================*/
loc_eng_mute_one_session(loc_eng_data_s_type & loc_eng_data)2002 void loc_eng_mute_one_session(loc_eng_data_s_type &loc_eng_data)
2003 {
2004     ENTRY_LOG();
2005     loc_eng_data.mute_session_state = LOC_MUTE_SESS_WAIT;
2006     EXIT_LOG(%s, VOID_RET);
2007 }
2008 
2009 /*===========================================================================
2010 FUNCTION    loc_eng_set_position_mode
2011 
2012 DESCRIPTION
2013    Sets the mode and fix frequency for the tracking session.
2014 
2015 DEPENDENCIES
2016    None
2017 
2018 RETURN VALUE
2019    0: success
2020 
2021 SIDE EFFECTS
2022    N/A
2023 
2024 ===========================================================================*/
loc_eng_set_position_mode(loc_eng_data_s_type & loc_eng_data,LocPosMode & params)2025 int loc_eng_set_position_mode(loc_eng_data_s_type &loc_eng_data,
2026                               LocPosMode &params)
2027 {
2028     ENTRY_LOG_CALLFLOW();
2029     INIT_CHECK(loc_eng_data.adapter, return -1);
2030 
2031     // The position mode for AUTO/GSS/QCA1530 can only be standalone
2032     if (!(gps_conf.CAPABILITIES & GPS_CAPABILITY_MSB) &&
2033         !(gps_conf.CAPABILITIES & GPS_CAPABILITY_MSA) &&
2034         (params.mode != LOC_POSITION_MODE_STANDALONE)) {
2035         params.mode = LOC_POSITION_MODE_STANDALONE;
2036         LOC_LOGD("Position mode changed to standalone for target with AUTO/GSS/qca1530.");
2037     }
2038 
2039     if(! loc_eng_data.adapter->getUlpProxy()->sendFixMode(params))
2040     {
2041         LocEngAdapter* adapter = loc_eng_data.adapter;
2042         adapter->sendMsg(new LocEngPositionMode(adapter, params));
2043     }
2044 
2045     EXIT_LOG(%d, 0);
2046     return 0;
2047 }
2048 
2049 /*===========================================================================
2050 FUNCTION    loc_eng_inject_time
2051 
2052 DESCRIPTION
2053    This is used by Java native function to do time injection.
2054 
2055 DEPENDENCIES
2056    None
2057 
2058 RETURN VALUE
2059    0
2060 
2061 SIDE EFFECTS
2062    N/A
2063 
2064 ===========================================================================*/
loc_eng_inject_time(loc_eng_data_s_type & loc_eng_data,GpsUtcTime time,int64_t timeReference,int uncertainty)2065 int loc_eng_inject_time(loc_eng_data_s_type &loc_eng_data, GpsUtcTime time,
2066                         int64_t timeReference, int uncertainty)
2067 {
2068     ENTRY_LOG_CALLFLOW();
2069     INIT_CHECK(loc_eng_data.adapter, return -1);
2070     LocEngAdapter* adapter = loc_eng_data.adapter;
2071 
2072     adapter->sendMsg(new LocEngSetTime(adapter, time, timeReference,
2073                                        uncertainty));
2074 
2075     EXIT_LOG(%d, 0);
2076     return 0;
2077 }
2078 
2079 
2080 /*===========================================================================
2081 FUNCTION    loc_eng_inject_location
2082 
2083 DESCRIPTION
2084    This is used by Java native function to do location injection.
2085 
2086 DEPENDENCIES
2087    None
2088 
2089 RETURN VALUE
2090    0          : Successful
2091    error code : Failure
2092 
2093 SIDE EFFECTS
2094    N/A
2095 ===========================================================================*/
loc_eng_inject_location(loc_eng_data_s_type & loc_eng_data,double latitude,double longitude,float accuracy)2096 int loc_eng_inject_location(loc_eng_data_s_type &loc_eng_data, double latitude,
2097                             double longitude, float accuracy)
2098 {
2099     ENTRY_LOG_CALLFLOW();
2100     INIT_CHECK(loc_eng_data.adapter, return -1);
2101     LocEngAdapter* adapter = loc_eng_data.adapter;
2102     if(adapter->mSupportsPositionInjection)
2103     {
2104         adapter->sendMsg(new LocEngInjectLocation(adapter, latitude, longitude,
2105                                                   accuracy));
2106     }
2107 
2108     EXIT_LOG(%d, 0);
2109     return 0;
2110 }
2111 
2112 
2113 /*===========================================================================
2114 FUNCTION    loc_eng_delete_aiding_data
2115 
2116 DESCRIPTION
2117    This is used by Java native function to delete the aiding data. The function
2118    updates the global variable for the aiding data to be deleted. If the GPS
2119    engine is off, the aiding data will be deleted. Otherwise, the actual action
2120    will happen when gps engine is turned off.
2121 
2122 DEPENDENCIES
2123    Assumes the aiding data type specified in GpsAidingData matches with
2124    LOC API specification.
2125 
2126 RETURN VALUE
2127    None
2128 
2129 SIDE EFFECTS
2130    N/A
2131 
2132 ===========================================================================*/
loc_eng_delete_aiding_data(loc_eng_data_s_type & loc_eng_data,GpsAidingData f)2133 void loc_eng_delete_aiding_data(loc_eng_data_s_type &loc_eng_data, GpsAidingData f)
2134 {
2135     ENTRY_LOG_CALLFLOW();
2136     INIT_CHECK(loc_eng_data.adapter, return);
2137 
2138     loc_eng_data.adapter->sendMsg(new LocEngDelAidData(&loc_eng_data, f));
2139 
2140     EXIT_LOG(%s, VOID_RET);
2141 }
2142 
2143 /*===========================================================================
2144 
2145 FUNCTION    loc_inform_gps_state
2146 
2147 DESCRIPTION
2148    Informs the GPS Provider about the GPS status
2149 
2150 DEPENDENCIES
2151    None
2152 
2153 RETURN VALUE
2154    None
2155 
2156 SIDE EFFECTS
2157    N/A
2158 
2159 ===========================================================================*/
loc_inform_gps_status(loc_eng_data_s_type & loc_eng_data,GpsStatusValue status)2160 static void loc_inform_gps_status(loc_eng_data_s_type &loc_eng_data, GpsStatusValue status)
2161 {
2162     ENTRY_LOG();
2163 
2164     if (loc_eng_data.status_cb)
2165     {
2166         GpsStatus gs = { sizeof(gs),status };
2167         CALLBACK_LOG_CALLFLOW("status_cb", %s,
2168                               loc_get_gps_status_name(gs.status));
2169         loc_eng_data.status_cb(&gs);
2170     }
2171 
2172     EXIT_LOG(%s, VOID_RET);
2173 }
2174 
loc_eng_get_zpp_handler(loc_eng_data_s_type & loc_eng_data)2175 static int loc_eng_get_zpp_handler(loc_eng_data_s_type &loc_eng_data)
2176 {
2177    ENTRY_LOG();
2178    int ret_val = LOC_API_ADAPTER_ERR_SUCCESS;
2179    UlpLocation location;
2180    LocPosTechMask tech_mask = LOC_POS_TECH_MASK_DEFAULT;
2181    GpsLocationExtended locationExtended;
2182    memset(&locationExtended, 0, sizeof (GpsLocationExtended));
2183    locationExtended.size = sizeof(locationExtended);
2184 
2185    ret_val = loc_eng_data.adapter->getZpp(location.gpsLocation, tech_mask);
2186   //Mark the location source as from ZPP
2187   location.gpsLocation.flags |= LOCATION_HAS_SOURCE_INFO;
2188   location.position_source = ULP_LOCATION_IS_FROM_ZPP;
2189 
2190   loc_eng_data.adapter->getUlpProxy()->reportPosition(location,
2191                                      locationExtended,
2192                                      NULL,
2193                                      LOC_SESS_SUCCESS,
2194                                      tech_mask);
2195 
2196   EXIT_LOG(%d, ret_val);
2197   return ret_val;
2198 }
2199 
2200 /*
2201   Callback function passed to Data Services State Machine
2202   This becomes part of the state machine's servicer and
2203   is used to send requests to the data services client
2204 */
dataCallCb(void * cb_data)2205 static int dataCallCb(void *cb_data)
2206 {
2207     LOC_LOGD("Enter dataCallCb\n");
2208     int ret=0;
2209     if(cb_data != NULL) {
2210         dsCbData *cbData = (dsCbData *)cb_data;
2211         LocEngAdapter *locAdapter = (LocEngAdapter *)cbData->mAdapter;
2212         if(cbData->action == GPS_REQUEST_AGPS_DATA_CONN) {
2213             LOC_LOGD("dataCallCb GPS_REQUEST_AGPS_DATA_CONN\n");
2214             ret =  locAdapter->openAndStartDataCall();
2215         }
2216         else if(cbData->action == GPS_RELEASE_AGPS_DATA_CONN) {
2217             LOC_LOGD("dataCallCb GPS_RELEASE_AGPS_DATA_CONN\n");
2218             locAdapter->stopDataCall();
2219         }
2220     }
2221     else {
2222         LOC_LOGE("NULL argument received. Failing.\n");
2223         ret = -1;
2224         goto err;
2225     }
2226 
2227 err:
2228     LOC_LOGD("Exit dataCallCb ret = %d\n", ret);
2229     return ret;
2230 }
2231 
2232 /*===========================================================================
2233 FUNCTION    loc_eng_agps_reinit
2234 
2235 DESCRIPTION
2236    2nd half of loc_eng_agps_init(), singled out for modem restart to use.
2237 
2238 DEPENDENCIES
2239    NONE
2240 
2241 RETURN VALUE
2242    0
2243 
2244 SIDE EFFECTS
2245    N/A
2246 
2247 ===========================================================================*/
loc_eng_agps_reinit(loc_eng_data_s_type & loc_eng_data)2248 static void loc_eng_agps_reinit(loc_eng_data_s_type &loc_eng_data)
2249 {
2250     ENTRY_LOG();
2251 
2252     // Set server addresses which came before init
2253     if (loc_eng_data.supl_host_set)
2254     {
2255         loc_eng_set_server(loc_eng_data, LOC_AGPS_SUPL_SERVER,
2256                            loc_eng_data.supl_host_buf,
2257                            loc_eng_data.supl_port_buf);
2258     }
2259 
2260     if (loc_eng_data.c2k_host_set)
2261     {
2262         loc_eng_set_server(loc_eng_data, LOC_AGPS_CDMA_PDE_SERVER,
2263                            loc_eng_data.c2k_host_buf,
2264                            loc_eng_data.c2k_port_buf);
2265     }
2266     EXIT_LOG(%s, VOID_RET);
2267 }
2268 /*===========================================================================
2269 FUNCTION    loc_eng_agps_init
2270 
2271 DESCRIPTION
2272    Initialize the AGps interface.
2273 
2274 DEPENDENCIES
2275    NONE
2276 
2277 RETURN VALUE
2278    0
2279 
2280 SIDE EFFECTS
2281    N/A
2282 
2283 ===========================================================================*/
loc_eng_agps_init(loc_eng_data_s_type & loc_eng_data,AGpsExtCallbacks * callbacks)2284 void loc_eng_agps_init(loc_eng_data_s_type &loc_eng_data, AGpsExtCallbacks* callbacks)
2285 {
2286     ENTRY_LOG_CALLFLOW();
2287     INIT_CHECK(loc_eng_data.adapter, return);
2288     STATE_CHECK((NULL == loc_eng_data.agps_status_cb),
2289                 "agps instance already initialized",
2290                 return);
2291     if (callbacks == NULL) {
2292         LOC_LOGE("loc_eng_agps_init: bad parameters cb %p", callbacks);
2293         EXIT_LOG(%s, VOID_RET);
2294         return;
2295     }
2296     LocEngAdapter* adapter = loc_eng_data.adapter;
2297     loc_eng_data.agps_status_cb = callbacks->status_cb;
2298 
2299     loc_eng_data.internet_nif = new AgpsStateMachine(servicerTypeAgps,
2300                                                      (void *)loc_eng_data.agps_status_cb,
2301                                                      AGPS_TYPE_WWAN_ANY,
2302                                                      false);
2303     loc_eng_data.wifi_nif = new AgpsStateMachine(servicerTypeAgps,
2304                                                  (void *)loc_eng_data.agps_status_cb,
2305                                                  AGPS_TYPE_WIFI,
2306                                                  true);
2307 
2308     if ((gps_conf.CAPABILITIES & GPS_CAPABILITY_MSA) ||
2309         (gps_conf.CAPABILITIES & GPS_CAPABILITY_MSB)) {
2310         loc_eng_data.agnss_nif = new AgpsStateMachine(servicerTypeAgps,
2311                                                       (void *)loc_eng_data.agps_status_cb,
2312                                                       AGPS_TYPE_SUPL,
2313                                                       false);
2314 
2315         if (adapter->mSupportsAgpsRequests) {
2316             if(gps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL) {
2317                 loc_eng_data.adapter->sendMsg(new LocEngDataClientInit(&loc_eng_data));
2318             }
2319             loc_eng_dmn_conn_loc_api_server_launch(callbacks->create_thread_cb,
2320                                                    NULL, NULL, &loc_eng_data);
2321         }
2322         loc_eng_agps_reinit(loc_eng_data);
2323     }
2324 
2325     EXIT_LOG(%s, VOID_RET);
2326 }
2327 
deleteAidingData(loc_eng_data_s_type & logEng)2328 static void deleteAidingData(loc_eng_data_s_type &logEng) {
2329     if (logEng.engine_status != GPS_STATUS_ENGINE_ON &&
2330         logEng.aiding_data_for_deletion != 0) {
2331         logEng.adapter->deleteAidingData(logEng.aiding_data_for_deletion);
2332         logEng.aiding_data_for_deletion = 0;
2333     }
2334 }
2335 
2336 static AgpsStateMachine*
getAgpsStateMachine(loc_eng_data_s_type & locEng,AGpsExtType agpsType)2337 getAgpsStateMachine(loc_eng_data_s_type &locEng, AGpsExtType agpsType) {
2338     AgpsStateMachine* stateMachine;
2339     switch (agpsType) {
2340     case AGPS_TYPE_WIFI: {
2341         stateMachine = locEng.wifi_nif;
2342         break;
2343     }
2344     case AGPS_TYPE_INVALID:
2345     case AGPS_TYPE_SUPL: {
2346         stateMachine = locEng.agnss_nif;
2347         break;
2348     }
2349     case AGPS_TYPE_SUPL_ES: {
2350         locEng.ds_nif ?
2351             stateMachine = locEng.ds_nif:
2352             stateMachine = locEng.agnss_nif;
2353         break;
2354     }
2355     default:
2356         stateMachine  = locEng.internet_nif;
2357     }
2358     return stateMachine;
2359 }
2360 
2361 /*===========================================================================
2362 FUNCTION    loc_eng_agps_open
2363 
2364 DESCRIPTION
2365    This function is called when on-demand data connection opening is successful.
2366 It should inform engine about the data open result.
2367 
2368 DEPENDENCIES
2369    NONE
2370 
2371 RETURN VALUE
2372    0
2373 
2374 SIDE EFFECTS
2375    N/A
2376 
2377 ===========================================================================*/
loc_eng_agps_open(loc_eng_data_s_type & loc_eng_data,AGpsExtType agpsType,const char * apn,AGpsBearerType bearerType)2378 int loc_eng_agps_open(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType,
2379                      const char* apn, AGpsBearerType bearerType)
2380 {
2381     ENTRY_LOG_CALLFLOW();
2382     INIT_CHECK(loc_eng_data.adapter && loc_eng_data.agps_status_cb,
2383                return -1);
2384 
2385     if (apn == NULL)
2386     {
2387         LOC_LOGE("APN Name NULL\n");
2388         return 0;
2389     }
2390 
2391     LOC_LOGD("loc_eng_agps_open APN name = [%s]", apn);
2392 
2393     int apn_len = smaller_of(strlen (apn), MAX_APN_LEN);
2394     AgpsStateMachine* sm = getAgpsStateMachine(loc_eng_data, agpsType);
2395 
2396     loc_eng_data.adapter->sendMsg(
2397         new LocEngAtlOpenSuccess(sm, apn, apn_len, bearerType));
2398 
2399     EXIT_LOG(%d, 0);
2400     return 0;
2401 }
2402 
2403 /*===========================================================================
2404 FUNCTION    loc_eng_agps_closed
2405 
2406 DESCRIPTION
2407    This function is called when on-demand data connection closing is done.
2408 It should inform engine about the data close result.
2409 
2410 DEPENDENCIES
2411    NONE
2412 
2413 RETURN VALUE
2414    0
2415 
2416 SIDE EFFECTS
2417    N/A
2418 
2419 ===========================================================================*/
loc_eng_agps_closed(loc_eng_data_s_type & loc_eng_data,AGpsExtType agpsType)2420 int loc_eng_agps_closed(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType)
2421 {
2422     ENTRY_LOG_CALLFLOW();
2423     INIT_CHECK(loc_eng_data.adapter && loc_eng_data.agps_status_cb,
2424                return -1);
2425 
2426     AgpsStateMachine* sm = getAgpsStateMachine(loc_eng_data, agpsType);
2427     loc_eng_data.adapter->sendMsg(new LocEngAtlClosed(sm));
2428 
2429     EXIT_LOG(%d, 0);
2430     return 0;
2431 }
2432 
2433 /*===========================================================================
2434 FUNCTION    loc_eng_agps_open_failed
2435 
2436 DESCRIPTION
2437    This function is called when on-demand data connection opening has failed.
2438 It should inform engine about the data open result.
2439 
2440 DEPENDENCIES
2441    NONE
2442 
2443 RETURN VALUE
2444    0
2445 
2446 SIDE EFFECTS
2447    N/A
2448 
2449 ===========================================================================*/
loc_eng_agps_open_failed(loc_eng_data_s_type & loc_eng_data,AGpsExtType agpsType)2450 int loc_eng_agps_open_failed(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType)
2451 {
2452     ENTRY_LOG_CALLFLOW();
2453     INIT_CHECK(loc_eng_data.adapter && loc_eng_data.agps_status_cb,
2454                return -1);
2455 
2456     AgpsStateMachine* sm = getAgpsStateMachine(loc_eng_data, agpsType);
2457     loc_eng_data.adapter->sendMsg(new LocEngAtlOpenFailed(sm));
2458 
2459     EXIT_LOG(%d, 0);
2460     return 0;
2461 }
2462 
2463 /*===========================================================================
2464 
2465 FUNCTION resolve_in_addr
2466 
2467 DESCRIPTION
2468    Translates a hostname to in_addr struct
2469 
2470 DEPENDENCIES
2471    n/a
2472 
2473 RETURN VALUE
2474    TRUE if successful
2475 
2476 SIDE EFFECTS
2477    n/a
2478 
2479 ===========================================================================*/
resolve_in_addr(const char * host_addr,struct in_addr * in_addr_ptr)2480 static boolean resolve_in_addr(const char *host_addr, struct in_addr *in_addr_ptr)
2481 {
2482     ENTRY_LOG();
2483     boolean ret_val = TRUE;
2484 
2485     struct hostent             *hp;
2486     hp = gethostbyname(host_addr);
2487     if (hp != NULL) /* DNS OK */
2488     {
2489         memcpy(in_addr_ptr, hp->h_addr_list[0], hp->h_length);
2490     }
2491     else
2492     {
2493         /* Try IP representation */
2494         if (inet_aton(host_addr, in_addr_ptr) == 0)
2495         {
2496             /* IP not valid */
2497             LOC_LOGE("DNS query on '%s' failed\n", host_addr);
2498             ret_val = FALSE;
2499         }
2500     }
2501 
2502     EXIT_LOG(%s, loc_logger_boolStr[ret_val!=0]);
2503     return ret_val;
2504 }
2505 
2506 /*===========================================================================
2507 FUNCTION    loc_eng_set_server
2508 
2509 DESCRIPTION
2510    This is used to set the default AGPS server. Server address is obtained
2511    from gps.conf.
2512 
2513 DEPENDENCIES
2514    NONE
2515 
2516 RETURN VALUE
2517    0
2518 
2519 SIDE EFFECTS
2520    N/A
2521 
2522 ===========================================================================*/
loc_eng_set_server(loc_eng_data_s_type & loc_eng_data,LocServerType type,const char * hostname,int port)2523 static int loc_eng_set_server(loc_eng_data_s_type &loc_eng_data,
2524                               LocServerType type, const char* hostname, int port)
2525 {
2526     ENTRY_LOG();
2527     int ret = 0;
2528     LocEngAdapter* adapter = loc_eng_data.adapter;
2529 
2530     if (LOC_AGPS_SUPL_SERVER == type) {
2531         char url[MAX_URL_LEN];
2532         unsigned int len = 0;
2533         const char nohost[] = "NONE";
2534         if (hostname == NULL ||
2535             strncasecmp(nohost, hostname, sizeof(nohost)) == 0) {
2536             url[0] = NULL;
2537         } else {
2538             len = snprintf(url, sizeof(url), "%s:%u", hostname, (unsigned) port);
2539         }
2540 
2541         if (sizeof(url) > len) {
2542             adapter->sendMsg(new LocEngSetServerUrl(adapter, url, len));
2543         }
2544     } else if (LOC_AGPS_CDMA_PDE_SERVER == type ||
2545                LOC_AGPS_CUSTOM_PDE_SERVER == type ||
2546                LOC_AGPS_MPC_SERVER == type) {
2547         struct in_addr addr;
2548         if (!resolve_in_addr(hostname, &addr))
2549         {
2550             LOC_LOGE("loc_eng_set_server, hostname %s cannot be resolved.\n", hostname);
2551             ret = -2;
2552         } else {
2553             unsigned int ip = htonl(addr.s_addr);
2554             adapter->sendMsg(new LocEngSetServerIpv4(adapter, ip, port, type));
2555         }
2556     } else {
2557         LOC_LOGE("loc_eng_set_server, type %d cannot be resolved.\n", type);
2558     }
2559 
2560     EXIT_LOG(%d, ret);
2561     return ret;
2562 }
2563 
2564 /*===========================================================================
2565 FUNCTION    loc_eng_set_server_proxy
2566 
2567 DESCRIPTION
2568    If loc_eng_set_server is called before loc_eng_init, it doesn't work. This
2569    proxy buffers server settings and calls loc_eng_set_server when the client is
2570    open.
2571 
2572 DEPENDENCIES
2573    NONE
2574 
2575 RETURN VALUE
2576    0
2577 
2578 SIDE EFFECTS
2579    N/A
2580 
2581 ===========================================================================*/
loc_eng_set_server_proxy(loc_eng_data_s_type & loc_eng_data,LocServerType type,const char * hostname,int port)2582 int loc_eng_set_server_proxy(loc_eng_data_s_type &loc_eng_data,
2583                              LocServerType type,
2584                              const char* hostname, int port)
2585 {
2586     ENTRY_LOG_CALLFLOW();
2587     int ret_val = 0;
2588 
2589     LOC_LOGV("save the address, type: %d, hostname: %s, port: %d",
2590              (int) type, hostname, port);
2591     switch (type)
2592     {
2593     case LOC_AGPS_SUPL_SERVER:
2594         strlcpy(loc_eng_data.supl_host_buf, hostname,
2595                 sizeof(loc_eng_data.supl_host_buf));
2596         loc_eng_data.supl_port_buf = port;
2597         loc_eng_data.supl_host_set = 1;
2598         break;
2599     case LOC_AGPS_CDMA_PDE_SERVER:
2600         strlcpy(loc_eng_data.c2k_host_buf, hostname,
2601                 sizeof(loc_eng_data.c2k_host_buf));
2602         loc_eng_data.c2k_port_buf = port;
2603         loc_eng_data.c2k_host_set = 1;
2604         break;
2605     default:
2606         LOC_LOGE("loc_eng_set_server_proxy, unknown server type = %d", (int) type);
2607     }
2608 
2609     if (NULL != loc_eng_data.adapter)
2610     {
2611         ret_val = loc_eng_set_server(loc_eng_data, type, hostname, port);
2612     }
2613 
2614     EXIT_LOG(%d, ret_val);
2615     return ret_val;
2616 }
2617 
2618 /*===========================================================================
2619 FUNCTION    loc_eng_agps_ril_update_network_availability
2620 
2621 DESCRIPTION
2622    Sets data call allow vs disallow flag to modem
2623    This is the only member of sLocEngAGpsRilInterface implemented.
2624 
2625 DEPENDENCIES
2626    None
2627 
2628 RETURN VALUE
2629    0: success
2630 
2631 SIDE EFFECTS
2632    N/A
2633 
2634 ===========================================================================*/
loc_eng_agps_ril_update_network_availability(loc_eng_data_s_type & loc_eng_data,int available,const char * apn)2635 void loc_eng_agps_ril_update_network_availability(loc_eng_data_s_type &loc_eng_data,
2636                                                   int available, const char* apn)
2637 {
2638     ENTRY_LOG_CALLFLOW();
2639 
2640     //This is to store the status of data availability over the network.
2641     //If GPS is not enabled, the INIT_CHECK will fail and the modem will
2642     //not be updated with the network's availability. Since the data status
2643     //can change before GPS is enabled the, storing the status will enable
2644     //us to inform the modem after GPS is enabled
2645     agpsStatus = available;
2646 
2647     INIT_CHECK(loc_eng_data.adapter, return);
2648     if (apn != NULL)
2649     {
2650         LOC_LOGD("loc_eng_agps_ril_update_network_availability: APN Name = [%s]\n", apn);
2651         int apn_len = smaller_of(strlen (apn), MAX_APN_LEN);
2652         LocEngAdapter* adapter = loc_eng_data.adapter;
2653         adapter->sendMsg(new LocEngEnableData(adapter, apn,  apn_len, available));
2654     }
2655     EXIT_LOG(%s, VOID_RET);
2656 }
2657 
loc_eng_agps_install_certificates(loc_eng_data_s_type & loc_eng_data,const DerEncodedCertificate * certificates,size_t numberOfCerts)2658 int loc_eng_agps_install_certificates(loc_eng_data_s_type &loc_eng_data,
2659                                       const DerEncodedCertificate* certificates,
2660                                       size_t numberOfCerts)
2661 {
2662     ENTRY_LOG_CALLFLOW();
2663     int ret_val = AGPS_CERTIFICATE_OPERATION_SUCCESS;
2664 
2665     uint32_t slotBitMask = gps_conf.AGPS_CERT_WRITABLE_MASK;
2666     uint32_t slotCount = 0;
2667     for (uint32_t slotBitMaskCounter=slotBitMask; slotBitMaskCounter; slotCount++) {
2668         slotBitMaskCounter &= slotBitMaskCounter - 1;
2669     }
2670     LOC_LOGD("SlotBitMask=%u SlotCount=%u NumberOfCerts=%u",
2671              slotBitMask, slotCount, numberOfCerts);
2672 
2673     LocEngAdapter* adapter = loc_eng_data.adapter;
2674 
2675     if (numberOfCerts == 0) {
2676         LOC_LOGE("No certs to install, since numberOfCerts is zero");
2677         ret_val = AGPS_CERTIFICATE_OPERATION_SUCCESS;
2678     } else if (!adapter) {
2679         LOC_LOGE("adapter is null!");
2680         ret_val = AGPS_CERTIFICATE_ERROR_GENERIC;
2681     } else if (slotCount < numberOfCerts) {
2682         LOC_LOGE("Not enough cert slots (%u) to install %u certs!",
2683                  slotCount, numberOfCerts);
2684         ret_val = AGPS_CERTIFICATE_ERROR_TOO_MANY_CERTIFICATES;
2685     } else {
2686         for (int i=0; i < numberOfCerts; ++i)
2687         {
2688             if (certificates[i].length > AGPS_CERTIFICATE_MAX_LENGTH) {
2689                 LOC_LOGE("cert#(%u) length of %u is too big! greater than %u",
2690                         certificates[i].length, AGPS_CERTIFICATE_MAX_LENGTH);
2691                 ret_val = AGPS_CERTIFICATE_ERROR_GENERIC;
2692                 break;
2693             }
2694         }
2695 
2696         if (ret_val == AGPS_CERTIFICATE_OPERATION_SUCCESS) {
2697             adapter->sendMsg(new LocEngInstallAGpsCert(adapter,
2698                                                        certificates,
2699                                                        numberOfCerts,
2700                                                        slotBitMask));
2701         }
2702     }
2703 
2704     EXIT_LOG(%d, ret_val);
2705     return ret_val;
2706 }
2707 
loc_eng_configuration_update(loc_eng_data_s_type & loc_eng_data,const char * config_data,int32_t length)2708 void loc_eng_configuration_update (loc_eng_data_s_type &loc_eng_data,
2709                                    const char* config_data, int32_t length)
2710 {
2711     ENTRY_LOG_CALLFLOW();
2712 
2713     if (config_data && length > 0) {
2714         loc_gps_cfg_s_type gps_conf_tmp = gps_conf;
2715         UTIL_UPDATE_CONF(config_data, length, gps_conf_table);
2716         LocEngAdapter* adapter = loc_eng_data.adapter;
2717 
2718         // it is possible that HAL is not init'ed at this time
2719         if (adapter) {
2720             if (gps_conf_tmp.SUPL_VER != gps_conf.SUPL_VER) {
2721                 adapter->sendMsg(new LocEngSuplVer(adapter, gps_conf.SUPL_VER));
2722             }
2723             if (gps_conf_tmp.LPP_PROFILE != gps_conf.LPP_PROFILE) {
2724                 adapter->sendMsg(new LocEngLppConfig(adapter, gps_conf.LPP_PROFILE));
2725             }
2726             if (gps_conf_tmp.A_GLONASS_POS_PROTOCOL_SELECT != gps_conf.A_GLONASS_POS_PROTOCOL_SELECT) {
2727                 adapter->sendMsg(new LocEngAGlonassProtocol(adapter,
2728                                                             gps_conf.A_GLONASS_POS_PROTOCOL_SELECT));
2729             }
2730             if (gps_conf_tmp.SUPL_MODE != gps_conf.SUPL_MODE) {
2731                 adapter->sendMsg(new LocEngSuplMode(adapter->getUlpProxy()));
2732             }
2733         }
2734 
2735         gps_conf_tmp.SUPL_VER = gps_conf.SUPL_VER;
2736         gps_conf_tmp.LPP_PROFILE = gps_conf.LPP_PROFILE;
2737         gps_conf_tmp.A_GLONASS_POS_PROTOCOL_SELECT = gps_conf.A_GLONASS_POS_PROTOCOL_SELECT;
2738         gps_conf_tmp.GPS_LOCK = gps_conf.GPS_LOCK;
2739         gps_conf = gps_conf_tmp;
2740     }
2741 
2742     EXIT_LOG(%s, VOID_RET);
2743 }
2744 
2745 /*===========================================================================
2746 FUNCTION    loc_eng_report_status
2747 
2748 DESCRIPTION
2749    Reports GPS engine state to Java layer.
2750 
2751 DEPENDENCIES
2752    N/A
2753 
2754 RETURN VALUE
2755    N/A
2756 
2757 SIDE EFFECTS
2758    N/A
2759 
2760 ===========================================================================*/
loc_eng_report_status(loc_eng_data_s_type & loc_eng_data,GpsStatusValue status)2761 static void loc_eng_report_status (loc_eng_data_s_type &loc_eng_data, GpsStatusValue status)
2762 {
2763     ENTRY_LOG();
2764     // Switch from WAIT to MUTE, for "engine on" or "session begin" event
2765     if (status == GPS_STATUS_SESSION_BEGIN || status == GPS_STATUS_ENGINE_ON)
2766     {
2767         if (loc_eng_data.mute_session_state == LOC_MUTE_SESS_WAIT)
2768         {
2769             LOC_LOGD("loc_eng_report_status: mute_session_state changed from WAIT to IN SESSION");
2770             loc_eng_data.mute_session_state = LOC_MUTE_SESS_IN_SESSION;
2771         }
2772     }
2773 
2774     // Switch off MUTE session
2775     if (loc_eng_data.mute_session_state == LOC_MUTE_SESS_IN_SESSION &&
2776         (status == GPS_STATUS_SESSION_END || status == GPS_STATUS_ENGINE_OFF))
2777     {
2778         LOC_LOGD("loc_eng_report_status: mute_session_state changed from IN SESSION to NONE");
2779         loc_eng_data.mute_session_state = LOC_MUTE_SESS_NONE;
2780     }
2781 
2782     // Session End is not reported during Android navigating state
2783     boolean navigating = loc_eng_data.adapter->isInSession();
2784     if (status != GPS_STATUS_NONE &&
2785         !(status == GPS_STATUS_SESSION_END && navigating) &&
2786         !(status == GPS_STATUS_SESSION_BEGIN && !navigating))
2787     {
2788         if (loc_eng_data.mute_session_state != LOC_MUTE_SESS_IN_SESSION)
2789         {
2790             // Inform GpsLocationProvider about mNavigating status
2791             loc_inform_gps_status(loc_eng_data, status);
2792         }
2793         else {
2794             LOC_LOGD("loc_eng_report_status: muting the status report.");
2795         }
2796     }
2797 
2798     // Only keeps ENGINE ON/OFF in engine_status
2799     if (status == GPS_STATUS_ENGINE_ON || status == GPS_STATUS_ENGINE_OFF)
2800     {
2801         loc_eng_data.engine_status = status;
2802     }
2803 
2804     // Only keeps SESSION BEGIN/END in fix_session_status
2805     if (status == GPS_STATUS_SESSION_BEGIN || status == GPS_STATUS_SESSION_END)
2806     {
2807         loc_eng_data.fix_session_status = status;
2808     }
2809     EXIT_LOG(%s, VOID_RET);
2810 }
2811 
2812 /*===========================================================================
2813 FUNCTION loc_eng_handle_engine_down
2814          loc_eng_handle_engine_up
2815 
2816 DESCRIPTION
2817    Calls this function when it is detected that modem restart is happening.
2818    Either we detected the modem is down or received modem up event.
2819    This must be called from the deferred thread to avoid race condition.
2820 
2821 DEPENDENCIES
2822    None
2823 
2824 RETURN VALUE
2825    None
2826 
2827 SIDE EFFECTS
2828    N/A
2829 
2830 ===========================================================================*/
loc_eng_handle_engine_down(loc_eng_data_s_type & loc_eng_data)2831 void loc_eng_handle_engine_down(loc_eng_data_s_type &loc_eng_data)
2832 {
2833     ENTRY_LOG();
2834     loc_eng_ni_reset_on_engine_restart(loc_eng_data);
2835     loc_eng_report_status(loc_eng_data, GPS_STATUS_ENGINE_OFF);
2836     EXIT_LOG(%s, VOID_RET);
2837 }
2838 
loc_eng_handle_engine_up(loc_eng_data_s_type & loc_eng_data)2839 void loc_eng_handle_engine_up(loc_eng_data_s_type &loc_eng_data)
2840 {
2841     ENTRY_LOG();
2842     loc_eng_reinit(loc_eng_data);
2843 
2844     loc_eng_data.adapter->requestPowerVote();
2845 
2846     if (loc_eng_data.agps_status_cb != NULL) {
2847         if (loc_eng_data.agnss_nif)
2848             loc_eng_data.agnss_nif->dropAllSubscribers();
2849         if (loc_eng_data.internet_nif)
2850             loc_eng_data.internet_nif->dropAllSubscribers();
2851 
2852         loc_eng_agps_reinit(loc_eng_data);
2853     }
2854 
2855     // modem is back up.  If we crashed in the middle of navigating, we restart.
2856     if (loc_eng_data.adapter->isInSession()) {
2857         // This sets the copy in adapter to modem
2858         loc_eng_data.adapter->setInSession(false);
2859         loc_eng_data.adapter->sendMsg(new LocEngStartFix(loc_eng_data.adapter));
2860     }
2861     EXIT_LOG(%s, VOID_RET);
2862 }
2863 
2864 #ifdef USE_GLIB
2865 /*===========================================================================
2866 FUNCTION set_sched_policy
2867 
2868 DESCRIPTION
2869    Local copy of this function which bypasses android set_sched_policy
2870 
2871 DEPENDENCIES
2872    None
2873 
2874 RETURN VALUE
2875    0
2876 
2877 SIDE EFFECTS
2878    N/A
2879 
2880 ===========================================================================*/
set_sched_policy(int tid,SchedPolicy policy)2881 static int set_sched_policy(int tid, SchedPolicy policy)
2882 {
2883     return 0;
2884 }
2885 #endif /* USE_GLIB */
2886 
2887 /*===========================================================================
2888 FUNCTION    loc_eng_read_config
2889 
2890 DESCRIPTION
2891    Initiates the reading of the gps config file stored in /etc dir
2892 
2893 DEPENDENCIES
2894    None
2895 
2896 RETURN VALUE
2897    0: success
2898 
2899 SIDE EFFECTS
2900    N/A
2901 
2902 ===========================================================================*/
loc_eng_read_config(void)2903 int loc_eng_read_config(void)
2904 {
2905     ENTRY_LOG_CALLFLOW();
2906     if(configAlreadyRead == false)
2907     {
2908       // Initialize our defaults before reading of configuration file overwrites them.
2909       loc_default_parameters();
2910       // We only want to parse the conf file once. This is a good place to ensure that.
2911       // In fact one day the conf file should go into context.
2912       UTIL_READ_CONF(GPS_CONF_FILE, gps_conf_table);
2913       UTIL_READ_CONF(SAP_CONF_FILE, sap_conf_table);
2914       configAlreadyRead = true;
2915     } else {
2916       LOC_LOGV("GPS Config file has already been read\n");
2917     }
2918 
2919     EXIT_LOG(%d, 0);
2920     return 0;
2921 }
2922 
2923 /*===========================================================================
2924 FUNCTION    loc_eng_gps_measurement_init
2925 
2926 DESCRIPTION
2927    Initialize gps measurement module.
2928 
2929 DEPENDENCIES
2930    N/A
2931 
2932 RETURN VALUE
2933    0: success
2934 
2935 SIDE EFFECTS
2936    N/A
2937 
2938 ===========================================================================*/
loc_eng_gps_measurement_init(loc_eng_data_s_type & loc_eng_data,GpsMeasurementCallbacks * callbacks)2939 int loc_eng_gps_measurement_init(loc_eng_data_s_type &loc_eng_data,
2940                                  GpsMeasurementCallbacks* callbacks)
2941 {
2942     ENTRY_LOG_CALLFLOW();
2943 
2944     STATE_CHECK((NULL == loc_eng_data.gps_measurement_cb),
2945                 "gps measurement already initialized",
2946                 return GPS_MEASUREMENT_ERROR_ALREADY_INIT);
2947     STATE_CHECK((callbacks != NULL),
2948                 "callbacks can not be NULL",
2949                 return GPS_MEASUREMENT_ERROR_GENERIC);
2950     STATE_CHECK(loc_eng_data.adapter,
2951                 "GpsInterface must be initialized first",
2952                 return GPS_MEASUREMENT_ERROR_GENERIC);
2953 
2954     // updated the mask
2955     LOC_API_ADAPTER_EVENT_MASK_T event = LOC_API_ADAPTER_BIT_GNSS_MEASUREMENT;
2956     loc_eng_data.adapter->sendMsg(new LocEngUpdateRegistrationMask(
2957                                                         &loc_eng_data,
2958                                                         event,
2959                                                         LOC_REGISTRATION_MASK_ENABLED));
2960     // set up the callback
2961     loc_eng_data.gps_measurement_cb = callbacks->measurement_callback;
2962     LOC_LOGD ("%s, event masks updated successfully", __func__);
2963 
2964     return GPS_MEASUREMENT_OPERATION_SUCCESS;
2965 }
2966 
2967 /*===========================================================================
2968 FUNCTION    loc_eng_gps_measurement_close
2969 
2970 DESCRIPTION
2971    Close gps measurement module.
2972 
2973 DEPENDENCIES
2974    N/A
2975 
2976 RETURN VALUE
2977    N/A
2978 
2979 SIDE EFFECTS
2980    N/A
2981 
2982 ===========================================================================*/
loc_eng_gps_measurement_close(loc_eng_data_s_type & loc_eng_data)2983 void loc_eng_gps_measurement_close(loc_eng_data_s_type &loc_eng_data)
2984 {
2985     ENTRY_LOG_CALLFLOW();
2986 
2987     INIT_CHECK(loc_eng_data.adapter, return);
2988 
2989     // updated the mask
2990     LOC_API_ADAPTER_EVENT_MASK_T event = LOC_API_ADAPTER_BIT_GNSS_MEASUREMENT;
2991     loc_eng_data.adapter->sendMsg(new LocEngUpdateRegistrationMask(
2992                                                           &loc_eng_data,
2993                                                           event,
2994                                                           LOC_REGISTRATION_MASK_DISABLED));
2995     // set up the callback
2996     loc_eng_data.gps_measurement_cb = NULL;
2997     EXIT_LOG(%d, 0);
2998 }
2999