Merge "Fixed a number of issues with NetworkInfoDataItemBase"

This commit is contained in:
Linux Build Service Account 2018-05-18 08:14:04 -07:00 committed by Gerrit - the friendly Code Review server
commit 113b20c3fc
5 changed files with 107 additions and 117 deletions

View file

@ -1250,8 +1250,7 @@ IOsObserver* SystemStatus::getOsObserver()
} }
SystemStatus::SystemStatus(const MsgTask* msgTask) : SystemStatus::SystemStatus(const MsgTask* msgTask) :
mSysStatusObsvr(this, msgTask), mSysStatusObsvr(this, msgTask)
mConnected(false)
{ {
int result = 0; int result = 0;
ENTRY_LOG (); ENTRY_LOG ();
@ -1301,17 +1300,10 @@ SystemStatus::SystemStatus(const MsgTask* msgTask) :
/****************************************************************************** /******************************************************************************
SystemStatus - storing dataitems SystemStatus - storing dataitems
******************************************************************************/ ******************************************************************************/
template <typename TYPE_SYSTEMSTATUS_ITEM, typename TYPE_REPORT, typename TYPE_ITEMBASE>
bool SystemStatus::setItemBaseinReport(TYPE_REPORT& report, const TYPE_ITEMBASE& s)
{
TYPE_SYSTEMSTATUS_ITEM sout(s);
return setIteminReport(report, sout);
}
template <typename TYPE_REPORT, typename TYPE_ITEM> template <typename TYPE_REPORT, typename TYPE_ITEM>
bool SystemStatus::setIteminReport(TYPE_REPORT& report, const TYPE_ITEM& s) bool SystemStatus::setIteminReport(TYPE_REPORT& report, TYPE_ITEM&& s)
{ {
if (!report.empty() && report.back().equals(s)) { if (!report.empty() && report.back().equals(static_cast<TYPE_ITEM&>(s.collate(report.back())))) {
// there is no change - just update reported timestamp // there is no change - just update reported timestamp
report.back().mUtcReported = s.mUtcReported; report.back().mUtcReported = s.mUtcReported;
return false; return false;
@ -1449,94 +1441,92 @@ bool SystemStatus::eventDataItemNotify(IDataItemCore* dataitem)
switch(dataitem->getId()) switch(dataitem->getId())
{ {
case AIRPLANEMODE_DATA_ITEM_ID: case AIRPLANEMODE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusAirplaneMode>(mCache.mAirplaneMode, ret = setIteminReport(mCache.mAirplaneMode,
*(static_cast<AirplaneModeDataItemBase*>(dataitem))); SystemStatusAirplaneMode(*(static_cast<AirplaneModeDataItemBase*>(dataitem))));
break; break;
case ENH_DATA_ITEM_ID: case ENH_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusENH>(mCache.mENH, ret = setIteminReport(mCache.mENH,
*(static_cast<ENHDataItemBase*>(dataitem))); SystemStatusENH(*(static_cast<ENHDataItemBase*>(dataitem))));
break; break;
case GPSSTATE_DATA_ITEM_ID: case GPSSTATE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusGpsState>(mCache.mGPSState, ret = setIteminReport(mCache.mGPSState,
*(static_cast<GPSStateDataItemBase*>(dataitem))); SystemStatusGpsState(*(static_cast<GPSStateDataItemBase*>(dataitem))));
break; break;
case NLPSTATUS_DATA_ITEM_ID: case NLPSTATUS_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusNLPStatus>(mCache.mNLPStatus, ret = setIteminReport(mCache.mNLPStatus,
*(static_cast<NLPStatusDataItemBase*>(dataitem))); SystemStatusNLPStatus(*(static_cast<NLPStatusDataItemBase*>(dataitem))));
break; break;
case WIFIHARDWARESTATE_DATA_ITEM_ID: case WIFIHARDWARESTATE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusWifiHardwareState>(mCache.mWifiHardwareState, ret = setIteminReport(mCache.mWifiHardwareState,
*(static_cast<WifiHardwareStateDataItemBase*>(dataitem))); SystemStatusWifiHardwareState(*(static_cast<WifiHardwareStateDataItemBase*>(dataitem))));
break; break;
case NETWORKINFO_DATA_ITEM_ID: case NETWORKINFO_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusNetworkInfo>(mCache.mNetworkInfo, ret = setIteminReport(mCache.mNetworkInfo,
*(static_cast<NetworkInfoDataItemBase*>(dataitem))); SystemStatusNetworkInfo(*(static_cast<NetworkInfoDataItemBase*>(dataitem))));
break; break;
case RILSERVICEINFO_DATA_ITEM_ID: case RILSERVICEINFO_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusServiceInfo>(mCache.mRilServiceInfo, ret = setIteminReport(mCache.mRilServiceInfo,
*(static_cast<RilServiceInfoDataItemBase*>(dataitem))); SystemStatusServiceInfo(*(static_cast<RilServiceInfoDataItemBase*>(dataitem))));
break; break;
case RILCELLINFO_DATA_ITEM_ID: case RILCELLINFO_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusRilCellInfo>(mCache.mRilCellInfo, ret = setIteminReport(mCache.mRilCellInfo,
*(static_cast<RilCellInfoDataItemBase*>(dataitem))); SystemStatusRilCellInfo(*(static_cast<RilCellInfoDataItemBase*>(dataitem))));
break; break;
case SERVICESTATUS_DATA_ITEM_ID: case SERVICESTATUS_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusServiceStatus>(mCache.mServiceStatus, ret = setIteminReport(mCache.mServiceStatus,
*(static_cast<ServiceStatusDataItemBase*>(dataitem))); SystemStatusServiceStatus(*(static_cast<ServiceStatusDataItemBase*>(dataitem))));
break; break;
case MODEL_DATA_ITEM_ID: case MODEL_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusModel>(mCache.mModel, ret = setIteminReport(mCache.mModel,
*(static_cast<ModelDataItemBase*>(dataitem))); SystemStatusModel(*(static_cast<ModelDataItemBase*>(dataitem))));
break; break;
case MANUFACTURER_DATA_ITEM_ID: case MANUFACTURER_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusManufacturer>(mCache.mManufacturer, ret = setIteminReport(mCache.mManufacturer,
*(static_cast<ManufacturerDataItemBase*>(dataitem))); SystemStatusManufacturer(*(static_cast<ManufacturerDataItemBase*>(dataitem))));
break; break;
case ASSISTED_GPS_DATA_ITEM_ID: case ASSISTED_GPS_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusAssistedGps>(mCache.mAssistedGps, ret = setIteminReport(mCache.mAssistedGps,
*(static_cast<AssistedGpsDataItemBase*>(dataitem))); SystemStatusAssistedGps(*(static_cast<AssistedGpsDataItemBase*>(dataitem))));
break; break;
case SCREEN_STATE_DATA_ITEM_ID: case SCREEN_STATE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusScreenState>(mCache.mScreenState, ret = setIteminReport(mCache.mScreenState,
*(static_cast<ScreenStateDataItemBase*>(dataitem))); SystemStatusScreenState(*(static_cast<ScreenStateDataItemBase*>(dataitem))));
break; break;
case POWER_CONNECTED_STATE_DATA_ITEM_ID: case POWER_CONNECTED_STATE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusPowerConnectState>(mCache.mPowerConnectState, ret = setIteminReport(mCache.mPowerConnectState,
*(static_cast<PowerConnectStateDataItemBase*>(dataitem))); SystemStatusPowerConnectState(*(static_cast<PowerConnectStateDataItemBase*>(dataitem))));
break; break;
case TIMEZONE_CHANGE_DATA_ITEM_ID: case TIMEZONE_CHANGE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusTimeZoneChange>(mCache.mTimeZoneChange, ret = setIteminReport(mCache.mTimeZoneChange,
*(static_cast<TimeZoneChangeDataItemBase*>(dataitem))); SystemStatusTimeZoneChange(*(static_cast<TimeZoneChangeDataItemBase*>(dataitem))));
break; break;
case TIME_CHANGE_DATA_ITEM_ID: case TIME_CHANGE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusTimeChange>(mCache.mTimeChange, ret = setIteminReport(mCache.mTimeChange,
*(static_cast<TimeChangeDataItemBase*>(dataitem))); SystemStatusTimeChange(*(static_cast<TimeChangeDataItemBase*>(dataitem))));
break; break;
case WIFI_SUPPLICANT_STATUS_DATA_ITEM_ID: case WIFI_SUPPLICANT_STATUS_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusWifiSupplicantStatus>( ret = setIteminReport(mCache.mWifiSupplicantStatus,
mCache.mWifiSupplicantStatus, SystemStatusWifiSupplicantStatus(*(static_cast<WifiSupplicantStatusDataItemBase*>(dataitem))));
*(static_cast<WifiSupplicantStatusDataItemBase*>(dataitem)));
break; break;
case SHUTDOWN_STATE_DATA_ITEM_ID: case SHUTDOWN_STATE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusShutdownState>(mCache.mShutdownState, ret = setIteminReport(mCache.mShutdownState,
*(static_cast<ShutdownStateDataItemBase*>(dataitem))); SystemStatusShutdownState(*(static_cast<ShutdownStateDataItemBase*>(dataitem))));
break; break;
case TAC_DATA_ITEM_ID: case TAC_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusTac>(mCache.mTac, ret = setIteminReport(mCache.mTac,
*(static_cast<TacDataItemBase*>(dataitem))); SystemStatusTac(*(static_cast<TacDataItemBase*>(dataitem))));
break; break;
case MCCMNC_DATA_ITEM_ID: case MCCMNC_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusMccMnc>(mCache.mMccMnc, ret = setIteminReport(mCache.mMccMnc,
*(static_cast<MccmncDataItemBase*>(dataitem))); SystemStatusMccMnc(*(static_cast<MccmncDataItemBase*>(dataitem))));
break; break;
case BTLE_SCAN_DATA_ITEM_ID: case BTLE_SCAN_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusBtDeviceScanDetail>(mCache.mBtDeviceScanDetail, ret = setIteminReport(mCache.mBtDeviceScanDetail,
*(static_cast<BtDeviceScanDetailsDataItemBase*>(dataitem))); SystemStatusBtDeviceScanDetail(*(static_cast<BtDeviceScanDetailsDataItemBase*>(dataitem))));
break; break;
case BT_SCAN_DATA_ITEM_ID: case BT_SCAN_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusBtleDeviceScanDetail>( ret = setIteminReport(mCache.mBtLeDeviceScanDetail,
mCache.mBtLeDeviceScanDetail, SystemStatusBtleDeviceScanDetail(*(static_cast<BtLeDeviceScanDetailsDataItemBase*>(dataitem))));
*(static_cast<BtLeDeviceScanDetailsDataItemBase*>(dataitem)));
break; break;
default: default:
break; break;
@ -1689,13 +1679,10 @@ bool SystemStatus::setDefaultGnssEngineStates(void)
******************************************************************************/ ******************************************************************************/
bool SystemStatus::eventConnectionStatus(bool connected, int8_t type) bool SystemStatus::eventConnectionStatus(bool connected, int8_t type)
{ {
if (connected != mConnected) { // send networkinof dataitem to systemstatus observer clients
mConnected = connected; SystemStatusNetworkInfo s(type, "", "", false, connected, false);
mSysStatusObsvr.notify({&s});
// send networkinof dataitem to systemstatus observer clients
SystemStatusNetworkInfo s(type, "", "", false, connected, false);
mSysStatusObsvr.notify({&s});
}
return true; return true;
} }

View file

@ -77,8 +77,11 @@ public:
mUtcTime.tv_nsec = tv.tv_nsec; mUtcTime.tv_nsec = tv.tv_nsec;
mUtcReported = mUtcTime; mUtcReported = mUtcTime;
}; };
virtual ~SystemStatusItemBase() { }; virtual ~SystemStatusItemBase() {};
virtual void dump(void) { }; inline virtual SystemStatusItemBase& collate(SystemStatusItemBase&) {
return *this;
}
virtual void dump(void) {};
}; };
class SystemStatusLocation : public SystemStatusItemBase class SystemStatusLocation : public SystemStatusItemBase
@ -93,7 +96,7 @@ public:
const GpsLocationExtended& locationEx) : const GpsLocationExtended& locationEx) :
mValid(true), mValid(true),
mLocation(location), mLocation(location),
mLocationEx(locationEx) { } mLocationEx(locationEx) {}
bool equals(const SystemStatusLocation& peer); bool equals(const SystemStatusLocation& peer);
void dump(void); void dump(void);
}; };
@ -457,6 +460,7 @@ public:
class SystemStatusNetworkInfo : public SystemStatusItemBase, class SystemStatusNetworkInfo : public SystemStatusItemBase,
public NetworkInfoDataItemBase public NetworkInfoDataItemBase
{ {
NetworkInfoDataItemBase* mSrcObjPtr;
public: public:
inline SystemStatusNetworkInfo( inline SystemStatusNetworkInfo(
int32_t type=0, int32_t type=0,
@ -466,18 +470,21 @@ public:
bool connected=false, bool connected=false,
bool roaming=false) : bool roaming=false) :
NetworkInfoDataItemBase( NetworkInfoDataItemBase(
(NetworkType)type,
type, type,
typeName, typeName,
subTypeName, subTypeName,
available, available,
connected, connected,
roaming) {} roaming),
mSrcObjPtr(nullptr) {}
inline SystemStatusNetworkInfo(const NetworkInfoDataItemBase& itemBase) : inline SystemStatusNetworkInfo(const NetworkInfoDataItemBase& itemBase) :
NetworkInfoDataItemBase(itemBase) { NetworkInfoDataItemBase(itemBase),
mSrcObjPtr((NetworkInfoDataItemBase*)&itemBase) {
mType = itemBase.getType(); mType = itemBase.getType();
} }
inline bool equals(const SystemStatusNetworkInfo& peer) { inline bool equals(const SystemStatusNetworkInfo& peer) {
if ((mType == peer.mType) && if ((mAllTypes == peer.mAllTypes) &&
(mTypeName == peer.mTypeName) && (mTypeName == peer.mTypeName) &&
(mSubTypeName == peer.mSubTypeName) && (mSubTypeName == peer.mSubTypeName) &&
(mAvailable == peer.mAvailable) && (mAvailable == peer.mAvailable) &&
@ -487,8 +494,24 @@ public:
} }
return false; return false;
} }
inline virtual SystemStatusItemBase& collate(SystemStatusItemBase& curInfo) {
uint64_t allTypes = (static_cast<SystemStatusNetworkInfo&>(curInfo)).mAllTypes;
if (mConnected) {
mAllTypes |= allTypes;
} else if (0 != mAllTypes) {
mAllTypes = (allTypes & (~mAllTypes));
} // else (mConnected == false && mAllTypes == 0)
// we keep mAllTypes as 0, which means no more connections.
if (nullptr != mSrcObjPtr) {
// this is critical, changing mAllTypes of the original obj
mSrcObjPtr->mAllTypes = mAllTypes;
}
return *this;
}
inline void dump(void) override { inline void dump(void) override {
LOC_LOGD("NetworkInfo: type=%u connected=%u", mType, mConnected); LOC_LOGD("NetworkInfo: mAllTypes=%" PRIx64 " connected=%u mType=%x",
mAllTypes, mConnected, mType);
} }
}; };
@ -783,13 +806,9 @@ private:
// Data members // Data members
static pthread_mutex_t mMutexSystemStatus; static pthread_mutex_t mMutexSystemStatus;
SystemStatusReports mCache; SystemStatusReports mCache;
bool mConnected;
template <typename TYPE_SYSTEMSTATUS_ITEM, typename TYPE_REPORT, typename TYPE_ITEMBASE>
bool setItemBaseinReport(TYPE_REPORT& report, const TYPE_ITEMBASE& s);
template <typename TYPE_REPORT, typename TYPE_ITEM> template <typename TYPE_REPORT, typename TYPE_ITEM>
bool setIteminReport(TYPE_REPORT& report, const TYPE_ITEM& s); bool setIteminReport(TYPE_REPORT& report, TYPE_ITEM&& s);
// set default dataitem derived item in report cache // set default dataitem derived item in report cache
template <typename TYPE_REPORT, typename TYPE_ITEM> template <typename TYPE_REPORT, typename TYPE_ITEM>

View file

@ -221,9 +221,23 @@ protected:
class NetworkInfoDataItemBase : public IDataItemCore { class NetworkInfoDataItemBase : public IDataItemCore {
public: public:
enum NetworkType {
TYPE_MOBILE,
TYPE_WIFI,
TYPE_ETHERNET,
TYPE_BLUETOOTH,
TYPE_MMS,
TYPE_SUPL,
TYPE_DUN,
TYPE_HIPRI,
TYPE_WIMAX,
TYPE_UNKNOWN,
};
NetworkInfoDataItemBase( NetworkInfoDataItemBase(
int32_t type, string typeName, string subTypeName, NetworkType initialType, int32_t type, string typeName, string subTypeName,
bool available, bool connected, bool roaming ): bool available, bool connected, bool roaming ):
mAllTypes((initialType >= TYPE_UNKNOWN || initialType < TYPE_MOBILE) ?
0 : (1<<initialType)),
mType(type), mType(type),
mTypeName(typeName), mTypeName(typeName),
mSubTypeName(subTypeName), mSubTypeName(subTypeName),
@ -235,22 +249,12 @@ public:
inline virtual DataItemId getId() { return mId; } inline virtual DataItemId getId() { return mId; }
virtual void stringify(string& /*valueStr*/) {} virtual void stringify(string& /*valueStr*/) {}
virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;}
enum NetworkType {
TYPE_UNKNOWN,
TYPE_MOBILE,
TYPE_WIFI,
TYPE_ETHERNET,
TYPE_BLUETOOTH,
TYPE_MMS,
TYPE_SUPL,
TYPE_DUN,
TYPE_HIPRI,
TYPE_WIMAX
};
inline virtual NetworkType getType(void) const { inline virtual NetworkType getType(void) const {
return (NetworkType)mType; return (NetworkType)mType;
} }
// Data members inline uint64_t getAllTypes() { return mAllTypes; }
// Data members
uint64_t mAllTypes;
int32_t mType; int32_t mType;
string mTypeName; string mTypeName;
string mSubTypeName; string mSubTypeName;

View file

@ -69,18 +69,9 @@ bool XtraSystemStatusObserver::updateLockStatus(uint32_t lock) {
return ( send(LOC_IPC_XTRA, ss.str()) ); return ( send(LOC_IPC_XTRA, ss.str()) );
} }
bool XtraSystemStatusObserver::updateConnectionStatus(bool connected, int32_t type) { bool XtraSystemStatusObserver::updateConnections(uint64_t allConnections) {
mIsConnectivityStatusKnown = true; mIsConnectivityStatusKnown = true;
mConnections = allConnections;
if (connected) {
mConnections.insert(type);
} else {
if (-1 == type) { // -1 for disconnecting all connections
mConnections.clear();
} else {
mConnections.erase(type);
}
}
if (!mReqStatusReceived) { if (!mReqStatusReceived) {
return true; return true;
@ -88,8 +79,7 @@ bool XtraSystemStatusObserver::updateConnectionStatus(bool connected, int32_t ty
stringstream ss; stringstream ss;
ss << "connection"; ss << "connection";
ss << " " << (connected ? "1" : "0"); ss << " " << mConnections;
ss << " " << type;
return ( send(LOC_IPC_XTRA, ss.str()) ); return ( send(LOC_IPC_XTRA, ss.str()) );
} }
@ -132,13 +122,6 @@ bool XtraSystemStatusObserver::updateXtraThrottle(const bool enabled) {
return ( send(LOC_IPC_XTRA, ss.str()) ); return ( send(LOC_IPC_XTRA, ss.str()) );
} }
static inline ostream& operator<<(ostream& os, CONNECTIONS& data) {
for (auto elem : data) {
os << elem << ' ';
}
return os;
}
inline bool XtraSystemStatusObserver::onStatusRequested(int32_t xtraStatusUpdated) { inline bool XtraSystemStatusObserver::onStatusRequested(int32_t xtraStatusUpdated) {
mReqStatusReceived = true; mReqStatusReceived = true;
@ -248,8 +231,7 @@ void XtraSystemStatusObserver::notify(const list<IDataItemCore*>& dlist)
{ {
NetworkInfoDataItemBase* networkInfo = NetworkInfoDataItemBase* networkInfo =
static_cast<NetworkInfoDataItemBase*>(each); static_cast<NetworkInfoDataItemBase*>(each);
mXtraSysStatObj->updateConnectionStatus(networkInfo->mConnected, mXtraSysStatObj->updateConnections(networkInfo->getAllTypes());
networkInfo->mType);
} }
break; break;

View file

@ -33,22 +33,20 @@
#include <MsgTask.h> #include <MsgTask.h>
#include <LocIpc.h> #include <LocIpc.h>
#include <LocTimer.h> #include <LocTimer.h>
#include <set>
using namespace std; using namespace std;
using loc_core::IOsObserver; using loc_core::IOsObserver;
using loc_core::IDataItemObserver; using loc_core::IDataItemObserver;
using loc_core::IDataItemCore; using loc_core::IDataItemCore;
using loc_util::LocIpc; using loc_util::LocIpc;
using CONNECTIONS = set<int32_t>;
class XtraSystemStatusObserver : public IDataItemObserver, public LocIpc{ class XtraSystemStatusObserver : public IDataItemObserver, public LocIpc{
public : public :
// constructor & destructor // constructor & destructor
inline XtraSystemStatusObserver(IOsObserver* sysStatObs, const MsgTask* msgTask): inline XtraSystemStatusObserver(IOsObserver* sysStatObs, const MsgTask* msgTask):
mSystemStatusObsrvr(sysStatObs), mMsgTask(msgTask), mSystemStatusObsrvr(sysStatObs), mMsgTask(msgTask),
mGpsLock(-1), mXtraThrottle(true), mReqStatusReceived(false), mDelayLocTimer(*this), mGpsLock(-1), mConnections(0), mXtraThrottle(true), mReqStatusReceived(false),
mIsConnectivityStatusKnown (false) { mDelayLocTimer(*this), mIsConnectivityStatusKnown (false) {
subscribe(true); subscribe(true);
startListeningNonBlocking(LOC_IPC_HAL); startListeningNonBlocking(LOC_IPC_HAL);
mDelayLocTimer.start(100 /*.1 sec*/, false); mDelayLocTimer.start(100 /*.1 sec*/, false);
@ -63,7 +61,7 @@ public :
virtual void notify(const list<IDataItemCore*>& dlist); virtual void notify(const list<IDataItemCore*>& dlist);
bool updateLockStatus(uint32_t lock); bool updateLockStatus(uint32_t lock);
bool updateConnectionStatus(bool connected, int32_t type); bool updateConnections(uint64_t allConnections);
bool updateTac(const string& tac); bool updateTac(const string& tac);
bool updateMccMnc(const string& mccmnc); bool updateMccMnc(const string& mccmnc);
bool updateXtraThrottle(const bool enabled); bool updateXtraThrottle(const bool enabled);
@ -77,7 +75,7 @@ private:
IOsObserver* mSystemStatusObsrvr; IOsObserver* mSystemStatusObsrvr;
const MsgTask* mMsgTask; const MsgTask* mMsgTask;
int32_t mGpsLock; int32_t mGpsLock;
CONNECTIONS mConnections; uint64_t mConnections;
string mTac; string mTac;
string mMccmnc; string mMccmnc;
bool mXtraThrottle; bool mXtraThrottle;