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