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