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