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