diff options
author | dianlujitao <dianlujitao@lineageos.org> | 2020-02-02 16:40:06 +0800 |
---|---|---|
committer | dianlujitao <dianlujitao@lineageos.org> | 2020-02-15 15:49:59 +0800 |
commit | 570a57c7abc1a0f0e48698821e0061dd2e807dc5 (patch) | |
tree | 345adba6b768011f63e0acb644ee03d87dc944f0 /gps/gnss/Agps.cpp | |
parent | d292a85ea71f9feb85267c21f1f59057018ffd5a (diff) |
sdm660-common: Remove GPS HAL for subtree import
Change-Id: Ib18b7d867224557562c3f6a4a20c206f0ec30fec
Diffstat (limited to 'gps/gnss/Agps.cpp')
-rw-r--r-- | gps/gnss/Agps.cpp | 912 |
1 files changed, 0 insertions, 912 deletions
diff --git a/gps/gnss/Agps.cpp b/gps/gnss/Agps.cpp deleted file mode 100644 index 6ce0c34..0000000 --- a/gps/gnss/Agps.cpp +++ /dev/null @@ -1,912 +0,0 @@ -/* Copyright (c) 2012-2017, 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. - * - */ - -#define LOG_TAG "LocSvc_Agps" - -#include <Agps.h> -#include <loc_pla.h> -#include <ContextBase.h> -#include <loc_timer.h> - -/* -------------------------------------------------------------------- - * AGPS State Machine Methods - * -------------------------------------------------------------------*/ -void AgpsStateMachine::processAgpsEvent(AgpsEvent event){ - - LOC_LOGD("processAgpsEvent(): SM %p, Event %d, State %d", - this, event, mState); - - switch (event) { - - case AGPS_EVENT_SUBSCRIBE: - processAgpsEventSubscribe(); - break; - - case AGPS_EVENT_UNSUBSCRIBE: - processAgpsEventUnsubscribe(); - break; - - case AGPS_EVENT_GRANTED: - processAgpsEventGranted(); - break; - - case AGPS_EVENT_RELEASED: - processAgpsEventReleased(); - break; - - case AGPS_EVENT_DENIED: - processAgpsEventDenied(); - break; - - default: - LOC_LOGE("Invalid Loc Agps Event"); - } -} - -void AgpsStateMachine::processAgpsEventSubscribe(){ - - switch (mState) { - - case AGPS_STATE_RELEASED: - /* Add subscriber to list - * No notifications until we get RSRC_GRANTED */ - addSubscriber(mCurrentSubscriber); - - /* Send data request - * The if condition below is added so that if the data call setup - * fails for DS State Machine, we want to retry in released state. - * for Agps State Machine, sendRsrcRequest() will always return - * success. */ - if (requestOrReleaseDataConn(true) == 0) { - // If data request successful, move to pending state - transitionState(AGPS_STATE_PENDING); - } - break; - - case AGPS_STATE_PENDING: - /* Already requested for data connection, - * do nothing until we get RSRC_GRANTED event; - * Just add this subscriber to the list, for notifications */ - addSubscriber(mCurrentSubscriber); - break; - - case AGPS_STATE_ACQUIRED: - /* We already have the data connection setup, - * Notify current subscriber with GRANTED event, - * And add it to the subscriber list for further notifications. */ - notifyEventToSubscriber(AGPS_EVENT_GRANTED, mCurrentSubscriber, false); - addSubscriber(mCurrentSubscriber); - break; - - case AGPS_STATE_RELEASING: - addSubscriber(mCurrentSubscriber); - break; - - default: - LOC_LOGE("Invalid state: %d", mState); - } -} - -void AgpsStateMachine::processAgpsEventUnsubscribe(){ - - switch (mState) { - - case AGPS_STATE_RELEASED: - notifyEventToSubscriber( - AGPS_EVENT_UNSUBSCRIBE, mCurrentSubscriber, false); - break; - - case AGPS_STATE_PENDING: - case AGPS_STATE_ACQUIRED: - /* If the subscriber wishes to wait for connection close, - * before being removed from list, move to inactive state - * and notify */ - if (mCurrentSubscriber->mWaitForCloseComplete) { - mCurrentSubscriber->mIsInactive = true; - } - else { - /* Notify only current subscriber and then delete it from - * subscriberList */ - notifyEventToSubscriber( - AGPS_EVENT_UNSUBSCRIBE, mCurrentSubscriber, true); - } - - /* If no subscribers in list, release data connection */ - if (mSubscriberList.empty()) { - transitionState(AGPS_STATE_RELEASED); - requestOrReleaseDataConn(false); - } - /* Some subscribers in list, but all inactive; - * Release data connection */ - else if(!anyActiveSubscribers()) { - transitionState(AGPS_STATE_RELEASING); - requestOrReleaseDataConn(false); - } - break; - - case AGPS_STATE_RELEASING: - /* If the subscriber wishes to wait for connection close, - * before being removed from list, move to inactive state - * and notify */ - if (mCurrentSubscriber->mWaitForCloseComplete) { - mCurrentSubscriber->mIsInactive = true; - } - else { - /* Notify only current subscriber and then delete it from - * subscriberList */ - notifyEventToSubscriber( - AGPS_EVENT_UNSUBSCRIBE, mCurrentSubscriber, true); - } - - /* If no subscribers in list, just move the state. - * Request for releasing data connection should already have been - * sent */ - if (mSubscriberList.empty()) { - transitionState(AGPS_STATE_RELEASED); - } - break; - - default: - LOC_LOGE("Invalid state: %d", mState); - } -} - -void AgpsStateMachine::processAgpsEventGranted(){ - - switch (mState) { - - case AGPS_STATE_RELEASED: - case AGPS_STATE_ACQUIRED: - case AGPS_STATE_RELEASING: - LOC_LOGE("Unexpected event GRANTED in state %d", mState); - break; - - case AGPS_STATE_PENDING: - // Move to acquired state - transitionState(AGPS_STATE_ACQUIRED); - notifyAllSubscribers( - AGPS_EVENT_GRANTED, false, - AGPS_NOTIFICATION_TYPE_FOR_ACTIVE_SUBSCRIBERS); - break; - - default: - LOC_LOGE("Invalid state: %d", mState); - } -} - -void AgpsStateMachine::processAgpsEventReleased(){ - - switch (mState) { - - case AGPS_STATE_RELEASED: - /* Subscriber list should be empty if we are in released state */ - if (!mSubscriberList.empty()) { - LOC_LOGE("Unexpected event RELEASED in RELEASED state"); - } - break; - - case AGPS_STATE_ACQUIRED: - /* Force release received */ - LOC_LOGW("Force RELEASED event in ACQUIRED state"); - transitionState(AGPS_STATE_RELEASED); - notifyAllSubscribers( - AGPS_EVENT_RELEASED, true, - AGPS_NOTIFICATION_TYPE_FOR_ALL_SUBSCRIBERS); - break; - - case AGPS_STATE_RELEASING: - /* Notify all inactive subscribers about the event */ - notifyAllSubscribers( - AGPS_EVENT_RELEASED, true, - AGPS_NOTIFICATION_TYPE_FOR_INACTIVE_SUBSCRIBERS); - - /* If we have active subscribers now, they must be waiting for - * data conn setup */ - if (anyActiveSubscribers()) { - transitionState(AGPS_STATE_PENDING); - requestOrReleaseDataConn(true); - } - /* No active subscribers, move to released state */ - else { - transitionState(AGPS_STATE_RELEASED); - } - break; - - case AGPS_STATE_PENDING: - /* NOOP */ - break; - - default: - LOC_LOGE("Invalid state: %d", mState); - } -} - -void AgpsStateMachine::processAgpsEventDenied(){ - - switch (mState) { - - case AGPS_STATE_RELEASED: - LOC_LOGE("Unexpected event DENIED in state %d", mState); - break; - - case AGPS_STATE_ACQUIRED: - /* NOOP */ - break; - - case AGPS_STATE_RELEASING: - /* Notify all inactive subscribers about the event */ - notifyAllSubscribers( - AGPS_EVENT_RELEASED, true, - AGPS_NOTIFICATION_TYPE_FOR_INACTIVE_SUBSCRIBERS); - - /* If we have active subscribers now, they must be waiting for - * data conn setup */ - if (anyActiveSubscribers()) { - transitionState(AGPS_STATE_PENDING); - requestOrReleaseDataConn(true); - } - /* No active subscribers, move to released state */ - else { - transitionState(AGPS_STATE_RELEASED); - } - break; - - case AGPS_STATE_PENDING: - transitionState(AGPS_STATE_RELEASED); - notifyAllSubscribers( - AGPS_EVENT_DENIED, true, - AGPS_NOTIFICATION_TYPE_FOR_ALL_SUBSCRIBERS); - break; - - default: - LOC_LOGE("Invalid state: %d", mState); - } -} - -/* Request or Release data connection - * bool request : - * true = Request data connection - * false = Release data connection */ -int AgpsStateMachine::requestOrReleaseDataConn(bool request){ - - AGnssExtStatusIpV4 nifRequest; - memset(&nifRequest, 0, sizeof(nifRequest)); - - nifRequest.type = mAgpsType; - - if (request) { - LOC_LOGD("AGPS Data Conn Request"); - nifRequest.status = LOC_GPS_REQUEST_AGPS_DATA_CONN; - } - else{ - LOC_LOGD("AGPS Data Conn Release"); - nifRequest.status = LOC_GPS_RELEASE_AGPS_DATA_CONN; - } - - mAgpsManager->mFrameworkStatusV4Cb(nifRequest); - return 0; -} - -void AgpsStateMachine::notifyAllSubscribers( - AgpsEvent event, bool deleteSubscriberPostNotify, - AgpsNotificationType notificationType){ - - LOC_LOGD("notifyAllSubscribers(): " - "SM %p, Event %d Delete %d Notification Type %d", - this, event, deleteSubscriberPostNotify, notificationType); - - std::list<AgpsSubscriber*>::const_iterator it = mSubscriberList.begin(); - while ( it != mSubscriberList.end() ) { - - AgpsSubscriber* subscriber = *it; - - if (notificationType == AGPS_NOTIFICATION_TYPE_FOR_ALL_SUBSCRIBERS || - (notificationType == AGPS_NOTIFICATION_TYPE_FOR_INACTIVE_SUBSCRIBERS && - subscriber->mIsInactive) || - (notificationType == AGPS_NOTIFICATION_TYPE_FOR_ACTIVE_SUBSCRIBERS && - !subscriber->mIsInactive)) { - - /* Deleting via this call would require another traversal - * through subscriber list, inefficient; hence pass in false*/ - notifyEventToSubscriber(event, subscriber, false); - - if (deleteSubscriberPostNotify) { - it = mSubscriberList.erase(it); - delete subscriber; - } else { - it++; - } - } else { - it++; - } - } -} - -void AgpsStateMachine::notifyEventToSubscriber( - AgpsEvent event, AgpsSubscriber* subscriberToNotify, - bool deleteSubscriberPostNotify) { - - LOC_LOGD("notifyEventToSubscriber(): " - "SM %p, Event %d Subscriber %p Delete %d", - this, event, subscriberToNotify, deleteSubscriberPostNotify); - - switch (event) { - - case AGPS_EVENT_GRANTED: - mAgpsManager->mAtlOpenStatusCb( - subscriberToNotify->mConnHandle, 1, getAPN(), - getBearer(), mAgpsType); - break; - - case AGPS_EVENT_DENIED: - mAgpsManager->mAtlOpenStatusCb( - subscriberToNotify->mConnHandle, 0, getAPN(), - getBearer(), mAgpsType); - break; - - case AGPS_EVENT_UNSUBSCRIBE: - case AGPS_EVENT_RELEASED: - mAgpsManager->mAtlCloseStatusCb(subscriberToNotify->mConnHandle, 1); - break; - - default: - LOC_LOGE("Invalid event %d", event); - } - - /* Search this subscriber in list and delete */ - if (deleteSubscriberPostNotify) { - deleteSubscriber(subscriberToNotify); - } -} - -void AgpsStateMachine::transitionState(AgpsState newState){ - - LOC_LOGD("transitionState(): SM %p, old %d, new %d", - this, mState, newState); - - mState = newState; - - // notify state transitions to all subscribers ? -} - -void AgpsStateMachine::addSubscriber(AgpsSubscriber* subscriberToAdd){ - - LOC_LOGD("addSubscriber(): SM %p, Subscriber %p", - this, subscriberToAdd); - - // Check if subscriber is already present in the current list - // If not, then add - std::list<AgpsSubscriber*>::const_iterator it = mSubscriberList.begin(); - for (; it != mSubscriberList.end(); it++) { - AgpsSubscriber* subscriber = *it; - if (subscriber->equals(subscriberToAdd)) { - LOC_LOGE("Subscriber already in list"); - return; - } - } - - AgpsSubscriber* cloned = subscriberToAdd->clone(); - LOC_LOGD("addSubscriber(): cloned subscriber: %p", cloned); - mSubscriberList.push_back(cloned); -} - -void AgpsStateMachine::deleteSubscriber(AgpsSubscriber* subscriberToDelete){ - - LOC_LOGD("deleteSubscriber(): SM %p, Subscriber %p", - this, subscriberToDelete); - - std::list<AgpsSubscriber*>::const_iterator it = mSubscriberList.begin(); - while ( it != mSubscriberList.end() ) { - - AgpsSubscriber* subscriber = *it; - if (subscriber && subscriber->equals(subscriberToDelete)) { - - it = mSubscriberList.erase(it); - delete subscriber; - } else { - it++; - } - } -} - -bool AgpsStateMachine::anyActiveSubscribers(){ - - std::list<AgpsSubscriber*>::const_iterator it = mSubscriberList.begin(); - for (; it != mSubscriberList.end(); it++) { - AgpsSubscriber* subscriber = *it; - if (!subscriber->mIsInactive) { - return true; - } - } - return false; -} - -void AgpsStateMachine::setAPN(char* apn, unsigned int len){ - - if (NULL != mAPN) { - delete mAPN; - } - - if (apn == NULL || len <= 0) { - LOC_LOGD("Invalid apn len (%d) or null apn", len); - mAPN = NULL; - mAPNLen = 0; - } - - if (NULL != apn) { - mAPN = new char[len+1]; - if (NULL != mAPN) { - memcpy(mAPN, apn, len); - mAPN[len] = '\0'; - mAPNLen = len; - } - } -} - -AgpsSubscriber* AgpsStateMachine::getSubscriber(int connHandle){ - - /* Go over the subscriber list */ - std::list<AgpsSubscriber*>::const_iterator it = mSubscriberList.begin(); - for (; it != mSubscriberList.end(); it++) { - AgpsSubscriber* subscriber = *it; - if (subscriber->mConnHandle == connHandle) { - return subscriber; - } - } - - /* Not found, return NULL */ - return NULL; -} - -AgpsSubscriber* AgpsStateMachine::getFirstSubscriber(bool isInactive){ - - /* Go over the subscriber list */ - std::list<AgpsSubscriber*>::const_iterator it = mSubscriberList.begin(); - for (; it != mSubscriberList.end(); it++) { - AgpsSubscriber* subscriber = *it; - if(subscriber->mIsInactive == isInactive) { - return subscriber; - } - } - - /* Not found, return NULL */ - return NULL; -} - -void AgpsStateMachine::dropAllSubscribers(){ - - LOC_LOGD("dropAllSubscribers(): SM %p", this); - - /* Go over the subscriber list */ - std::list<AgpsSubscriber*>::const_iterator it = mSubscriberList.begin(); - while ( it != mSubscriberList.end() ) { - AgpsSubscriber* subscriber = *it; - it = mSubscriberList.erase(it); - delete subscriber; - } -} - -/* -------------------------------------------------------------------- - * DS State Machine Methods - * -------------------------------------------------------------------*/ -const int DSStateMachine::MAX_START_DATA_CALL_RETRIES = 4; -const int DSStateMachine::DATA_CALL_RETRY_DELAY_MSEC = 500; - -/* Overridden method - * DS SM needs to handle one scenario differently */ -void DSStateMachine::processAgpsEvent(AgpsEvent event) { - - LOC_LOGD("DSStateMachine::processAgpsEvent() %d", event); - - /* DS Client call setup APIs don't return failure/closure separately. - * Hence we receive RELEASED event in both cases. - * If we are in pending, we should consider RELEASED as DENIED */ - if (event == AGPS_EVENT_RELEASED && mState == AGPS_STATE_PENDING) { - - LOC_LOGD("Translating RELEASED to DENIED event"); - event = AGPS_EVENT_DENIED; - } - - /* Redirect process to base class */ - AgpsStateMachine::processAgpsEvent(event); -} - -/* Timer Callback - * For the retry timer started in case of DS Client call setup failure */ -void delay_callback(void *callbackData, int result) -{ - LOC_LOGD("delay_callback(): cbData %p", callbackData); - - (void)result; - - if (callbackData == NULL) { - LOC_LOGE("delay_callback(): NULL argument received !"); - return; - } - DSStateMachine* dsStateMachine = (DSStateMachine *)callbackData; - dsStateMachine->retryCallback(); -} - -/* Invoked from Timer Callback - * For the retry timer started in case of DS Client call setup failure */ -void DSStateMachine :: retryCallback() -{ - LOC_LOGD("DSStateMachine::retryCallback()"); - - /* Request SUPL ES - * There must be at least one active subscriber in list */ - AgpsSubscriber* subscriber = getFirstSubscriber(false); - if (subscriber == NULL) { - - LOC_LOGE("No active subscriber for DS Client call setup"); - return; - } - - /* Send message to retry */ - mAgpsManager->mSendMsgToAdapterQueueFn( - new AgpsMsgRequestATL( - mAgpsManager, subscriber->mConnHandle, - LOC_AGPS_TYPE_SUPL_ES)); -} - -/* Overridden method - * Request or Release data connection - * bool request : - * true = Request data connection - * false = Release data connection */ -int DSStateMachine::requestOrReleaseDataConn(bool request){ - - LOC_LOGD("DSStateMachine::requestOrReleaseDataConn(): " - "request %d", request); - - /* Release data connection required ? */ - if (!request && mAgpsManager->mDSClientStopDataCallFn) { - - mAgpsManager->mDSClientStopDataCallFn(); - LOC_LOGD("DS Client release data call request sent !"); - return 0; - } - - /* Setup data connection request - * There must be at least one active subscriber in list */ - AgpsSubscriber* subscriber = getFirstSubscriber(false); - if (subscriber == NULL) { - - LOC_LOGE("No active subscriber for DS Client call setup"); - return -1; - } - - /* DS Client Fn registered ? */ - if (!mAgpsManager->mDSClientOpenAndStartDataCallFn) { - - LOC_LOGE("DS Client start fn not registered, fallback to SUPL ATL"); - notifyEventToSubscriber(AGPS_EVENT_DENIED, subscriber, false); - return -1; - } - - /* Setup the call */ - int ret = mAgpsManager->mDSClientOpenAndStartDataCallFn(); - - /* Check if data call start failed */ - switch (ret) { - - case LOC_API_ADAPTER_ERR_ENGINE_BUSY: - LOC_LOGE("DS Client open call failed, err: %d", ret); - mRetries++; - if (mRetries > MAX_START_DATA_CALL_RETRIES) { - - LOC_LOGE("DS Client call retries exhausted, " - "falling back to normal SUPL ATL"); - notifyEventToSubscriber(AGPS_EVENT_DENIED, subscriber, false); - } - /* Retry DS Client call setup after some delay */ - else if(loc_timer_start( - DATA_CALL_RETRY_DELAY_MSEC, delay_callback, this)) { - LOC_LOGE("Error: Could not start delay thread\n"); - return -1; - } - break; - - case LOC_API_ADAPTER_ERR_UNSUPPORTED: - LOC_LOGE("No emergency profile found. Fall back to normal SUPL ATL"); - notifyEventToSubscriber(AGPS_EVENT_DENIED, subscriber, false); - break; - - case LOC_API_ADAPTER_ERR_SUCCESS: - LOC_LOGD("Request to start data call sent"); - break; - - default: - LOC_LOGE("Unrecognized return value: %d", ret); - } - - return ret; -} - -void DSStateMachine::notifyEventToSubscriber( - AgpsEvent event, AgpsSubscriber* subscriberToNotify, - bool deleteSubscriberPostNotify) { - - LOC_LOGD("DSStateMachine::notifyEventToSubscriber(): " - "SM %p, Event %d Subscriber %p Delete %d", - this, event, subscriberToNotify, deleteSubscriberPostNotify); - - switch (event) { - - case AGPS_EVENT_GRANTED: - mAgpsManager->mAtlOpenStatusCb( - subscriberToNotify->mConnHandle, 1, NULL, - AGPS_APN_BEARER_INVALID, LOC_AGPS_TYPE_SUPL_ES); - break; - - case AGPS_EVENT_DENIED: - /* Now try with regular SUPL - * We need to send request via message queue */ - mRetries = 0; - mAgpsManager->mSendMsgToAdapterQueueFn( - new AgpsMsgRequestATL( - mAgpsManager, subscriberToNotify->mConnHandle, - LOC_AGPS_TYPE_SUPL)); - break; - - case AGPS_EVENT_UNSUBSCRIBE: - mAgpsManager->mAtlCloseStatusCb(subscriberToNotify->mConnHandle, 1); - break; - - case AGPS_EVENT_RELEASED: - mAgpsManager->mDSClientCloseDataCallFn(); - mAgpsManager->mAtlCloseStatusCb(subscriberToNotify->mConnHandle, 1); - break; - - default: - LOC_LOGE("Invalid event %d", event); - } - - /* Search this subscriber in list and delete */ - if (deleteSubscriberPostNotify) { - deleteSubscriber(subscriberToNotify); - } -} - -/* -------------------------------------------------------------------- - * Loc AGPS Manager Methods - * -------------------------------------------------------------------*/ - -/* CREATE AGPS STATE MACHINES - * Must be invoked in Msg Handler context */ -void AgpsManager::createAgpsStateMachines() { - - LOC_LOGD("AgpsManager::createAgpsStateMachines"); - - bool agpsCapable = - ((loc_core::ContextBase::mGps_conf.CAPABILITIES & LOC_GPS_CAPABILITY_MSA) || - (loc_core::ContextBase::mGps_conf.CAPABILITIES & LOC_GPS_CAPABILITY_MSB)); - - if (NULL == mInternetNif) { - mInternetNif = new AgpsStateMachine(this, LOC_AGPS_TYPE_WWAN_ANY); - LOC_LOGD("Internet NIF: %p", mInternetNif); - } - if (agpsCapable) { - if (NULL == mAgnssNif) { - mAgnssNif = new AgpsStateMachine(this, LOC_AGPS_TYPE_SUPL); - LOC_LOGD("AGNSS NIF: %p", mAgnssNif); - } - if (NULL == mDsNif && - loc_core::ContextBase::mGps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL) { - - if(!mDSClientInitFn){ - - LOC_LOGE("DS Client Init Fn not registered !"); - return; - } - if (mDSClientInitFn(false) != 0) { - - LOC_LOGE("Failed to init data service client"); - return; - } - mDsNif = new DSStateMachine(this); - LOC_LOGD("DS NIF: %p", mDsNif); - } - } -} - -AgpsStateMachine* AgpsManager::getAgpsStateMachine(AGpsExtType agpsType) { - - LOC_LOGD("AgpsManager::getAgpsStateMachine(): agpsType %d", agpsType); - - switch (agpsType) { - - case LOC_AGPS_TYPE_INVALID: - case LOC_AGPS_TYPE_SUPL: - if (mAgnssNif == NULL) { - LOC_LOGE("NULL AGNSS NIF !"); - } - return mAgnssNif; - - case LOC_AGPS_TYPE_SUPL_ES: - if (loc_core::ContextBase::mGps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL) { - if (mDsNif == NULL) { - createAgpsStateMachines(); - } - return mDsNif; - } else { - return mAgnssNif; - } - - default: - return mInternetNif; - } - - LOC_LOGE("No SM found !"); - return NULL; -} - -void AgpsManager::requestATL(int connHandle, AGpsExtType agpsType){ - - LOC_LOGD("AgpsManager::requestATL(): connHandle %d, agpsType %d", - connHandle, agpsType); - - AgpsStateMachine* sm = getAgpsStateMachine(agpsType); - - if (sm == NULL) { - - LOC_LOGE("No AGPS State Machine for agpsType: %d", agpsType); - mAtlOpenStatusCb( - connHandle, 0, NULL, AGPS_APN_BEARER_INVALID, agpsType); - return; - } - - /* Invoke AGPS SM processing */ - AgpsSubscriber subscriber(connHandle, false, false); - sm->setCurrentSubscriber(&subscriber); - - /* If DS State Machine, wait for close complete */ - if (agpsType == LOC_AGPS_TYPE_SUPL_ES) { - subscriber.mWaitForCloseComplete = true; - } - - /* Send subscriber event */ - sm->processAgpsEvent(AGPS_EVENT_SUBSCRIBE); -} - -void AgpsManager::releaseATL(int connHandle){ - - LOC_LOGD("AgpsManager::releaseATL(): connHandle %d", connHandle); - - /* First find the subscriber with specified handle. - * We need to search in all state machines. */ - AgpsStateMachine* sm = NULL; - AgpsSubscriber* subscriber = NULL; - - if (mAgnssNif && - (subscriber = mAgnssNif->getSubscriber(connHandle)) != NULL) { - sm = mAgnssNif; - } - else if (mInternetNif && - (subscriber = mInternetNif->getSubscriber(connHandle)) != NULL) { - sm = mInternetNif; - } - else if (mDsNif && - (subscriber = mDsNif->getSubscriber(connHandle)) != NULL) { - sm = mDsNif; - } - - if (sm == NULL) { - LOC_LOGE("Subscriber with connHandle %d not found in any SM", - connHandle); - mAtlCloseStatusCb(connHandle, 0); - return; - } - - /* Now send unsubscribe event */ - sm->setCurrentSubscriber(subscriber); - sm->processAgpsEvent(AGPS_EVENT_UNSUBSCRIBE); -} - -void AgpsManager::reportDataCallOpened(){ - - LOC_LOGD("AgpsManager::reportDataCallOpened"); - - if (mDsNif) { - mDsNif->processAgpsEvent(AGPS_EVENT_GRANTED); - } -} - -void AgpsManager::reportDataCallClosed(){ - - LOC_LOGD("AgpsManager::reportDataCallClosed"); - - if (mDsNif) { - mDsNif->processAgpsEvent(AGPS_EVENT_RELEASED); - } -} - -void AgpsManager::reportAtlOpenSuccess( - AGpsExtType agpsType, char* apnName, int apnLen, - AGpsBearerType bearerType){ - - LOC_LOGD("AgpsManager::reportAtlOpenSuccess(): " - "AgpsType %d, APN [%s], Len %d, BearerType %d", - agpsType, apnName, apnLen, bearerType); - - /* Find the state machine instance */ - AgpsStateMachine* sm = getAgpsStateMachine(agpsType); - - /* Set bearer and apn info in state machine instance */ - sm->setBearer(bearerType); - sm->setAPN(apnName, apnLen); - - /* Send GRANTED event to state machine */ - sm->processAgpsEvent(AGPS_EVENT_GRANTED); -} - -void AgpsManager::reportAtlOpenFailed(AGpsExtType agpsType){ - - LOC_LOGD("AgpsManager::reportAtlOpenFailed(): AgpsType %d", agpsType); - - /* Fetch SM and send DENIED event */ - AgpsStateMachine* sm = getAgpsStateMachine(agpsType); - sm->processAgpsEvent(AGPS_EVENT_DENIED); -} - -void AgpsManager::reportAtlClosed(AGpsExtType agpsType){ - - LOC_LOGD("AgpsManager::reportAtlClosed(): AgpsType %d", agpsType); - - /* Fetch SM and send RELEASED event */ - AgpsStateMachine* sm = getAgpsStateMachine(agpsType); - sm->processAgpsEvent(AGPS_EVENT_RELEASED); -} - -void AgpsManager::handleModemSSR(){ - - LOC_LOGD("AgpsManager::handleModemSSR"); - - /* Drop subscribers from all state machines */ - if (mAgnssNif) { - mAgnssNif->dropAllSubscribers(); - } - if (mInternetNif) { - mInternetNif->dropAllSubscribers(); - } - if (mDsNif) { - mDsNif->dropAllSubscribers(); - } - - // reinitialize DS client in SSR mode - if (loc_core::ContextBase::mGps_conf. - USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL) { - - mDSClientStopDataCallFn(); - mDSClientCloseDataCallFn(); - mDSClientReleaseFn(); - - mDSClientInitFn(true); - } -} |