123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- /* Copyright (c) 2020, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation, nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
- /*
- Changes from Qualcomm Innovation Center are provided under the following license:
- Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted (subject to the limitations in the
- disclaimer below) provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
- * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
- GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
- HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
- WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
- IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- #define LOG_TAG "LocSvc_NativeAgpsHandler"
- #include <LocAdapterBase.h>
- #include <SystemStatus.h>
- #include <DataItemId.h>
- #include <DataItemsFactoryProxy.h>
- #include <DataItemConcreteTypes.h>
- #include <loc_log.h>
- #include <NativeAgpsHandler.h>
- #include <GnssAdapter.h>
- using namespace loc_core;
- // IDataItemObserver overrides
- void NativeAgpsHandler::getName(string& name) {
- name = "NativeAgpsHandler";
- }
- void NativeAgpsHandler::notify(const unordered_set<IDataItemCore*>& dlist) {
- for (auto each : dlist) {
- switch (each->getId()) {
- case NETWORKINFO_DATA_ITEM_ID: {
- NetworkInfoDataItem* networkInfo = static_cast<NetworkInfoDataItem*>(each);
- uint64_t mobileBit = (uint64_t )1 << loc_core::TYPE_MOBILE;
- mConnected = ((networkInfo->mAllTypes & mobileBit) == mobileBit);
- /**
- * mApn Telephony preferred Access Point Name to use for
- * carrier data connection when connected to a cellular network.
- * Empty string, otherwise.
- */
- mApn = networkInfo->mApn;
- LOC_LOGd("updated mConnected:%d, mApn: %s", mConnected, mApn.c_str());
- break;
- }
- default:
- break;
- }
- }
- }
- NativeAgpsHandler* NativeAgpsHandler::sLocalHandle = nullptr;
- NativeAgpsHandler::NativeAgpsHandler(IOsObserver* sysStatObs, GnssAdapter& adapter) :
- mSystemStatusObsrvr(sysStatObs), mConnected(false), mAdapter(adapter) {
- sLocalHandle = this;
- unordered_set<DataItemId> subItemIdList = {NETWORKINFO_DATA_ITEM_ID};
- mSystemStatusObsrvr->subscribe(subItemIdList, this);
- }
- NativeAgpsHandler::~NativeAgpsHandler() {
- if (nullptr != mSystemStatusObsrvr) {
- LOC_LOGd("Unsubscribe for network info.");
- unordered_set<DataItemId> subItemIdList = {NETWORKINFO_DATA_ITEM_ID};
- mSystemStatusObsrvr->unsubscribe(subItemIdList, this);
- }
- sLocalHandle = nullptr;
- mSystemStatusObsrvr = nullptr;
- }
- AgpsCbInfo NativeAgpsHandler::getAgpsCbInfo() {
- AgpsCbInfo nativeCbInfo = {};
- nativeCbInfo.statusV4Cb = (void*)agnssStatusIpV4Cb;
- nativeCbInfo.atlType = AGPS_ATL_TYPE_WWAN;
- return nativeCbInfo;
- }
- void NativeAgpsHandler::agnssStatusIpV4Cb(AGnssExtStatusIpV4 statusInfo) {
- if (nullptr != sLocalHandle) {
- sLocalHandle->processATLRequestRelease(statusInfo);
- } else {
- LOC_LOGe("sLocalHandle is null");
- }
- }
- void NativeAgpsHandler::processATLRequestRelease(AGnssExtStatusIpV4 statusInfo) {
- if (LOC_AGPS_TYPE_WWAN_ANY == statusInfo.type) {
- LOC_LOGd("status.type = %d status.apnTypeMask = 0x%X", statusInfo.type,
- statusInfo.apnTypeMask);
- switch (statusInfo.status) {
- case LOC_GPS_REQUEST_AGPS_DATA_CONN:
- if (mConnected) {
- mAdapter.dataConnOpenCommand(LOC_AGPS_TYPE_WWAN_ANY, mApn.c_str(), mApn.size(),
- AGPS_APN_BEARER_IPV4);
- } else {
- mAdapter.dataConnFailedCommand(LOC_AGPS_TYPE_WWAN_ANY);
- }
- break;
- case LOC_GPS_RELEASE_AGPS_DATA_CONN:
- mAdapter.dataConnClosedCommand(LOC_AGPS_TYPE_WWAN_ANY);
- break;
- default:
- LOC_LOGe("Invalid Request: %d", statusInfo.status);
- }
- } else {
- LOC_LOGe("mAgpsManger is null or invalid request type!");
- }
- }
|