1ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. 2ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * 3ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * Redistribution and use in source and binary forms, with or without 4ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * modification, are permitted provided that the following conditions are 5ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * met: 6ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * * Redistributions of source code must retain the above copyright 7ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * notice, this list of conditions and the following disclaimer. 8ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * * Redistributions in binary form must reproduce the above 9ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * copyright notice, this list of conditions and the following 10ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * disclaimer in the documentation and/or other materials provided 11ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * with the distribution. 12ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * * Neither the name of The Linux Foundation, nor the names of its 13ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * contributors may be used to endorse or promote products derived 14ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * from this software without specific prior written permission. 15ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * 16ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * 28ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo */ 29ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 30ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#ifndef __LOC_ENG_AGPS_H__ 31ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#define __LOC_ENG_AGPS_H__ 32ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 33ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include <stdbool.h> 34ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include <ctype.h> 35ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include <string.h> 36ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include <arpa/inet.h> 37ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include <hardware/gps.h> 38ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include <gps_extended.h> 39ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include <loc_core_log.h> 40ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include <linked_list.h> 41ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include <loc_timer.h> 42ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include <LocEngAdapter.h> 43ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 44ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo// forward declaration 45ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoclass AgpsStateMachine; 46ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoclass Subscriber; 47ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 48ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo// NIF resource events 49ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russotypedef enum { 50ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo RSRC_SUBSCRIBE, 51ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo RSRC_UNSUBSCRIBE, 52ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo RSRC_GRANTED, 53ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo RSRC_RELEASED, 54ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo RSRC_DENIED, 55ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo RSRC_STATUS_MAX 56ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo} AgpsRsrcStatus; 57ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 58ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russotypedef enum { 59ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo servicerTypeNoCbParam, 60ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo servicerTypeAgps, 61ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo servicerTypeExt 62ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}servicerType; 63ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 64ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo//DS Callback struct 65ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russotypedef struct { 66ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo LocEngAdapter *mAdapter; 67ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo AGpsStatusValue action; 68ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}dsCbData; 69ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 70ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo// information bundle for subscribers 71ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russostruct Notification { 72ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // goes to every subscriber 73ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo static const int BROADCAST_ALL; 74ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // goes to every ACTIVE subscriber 75ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo static const int BROADCAST_ACTIVE; 76ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // goes to every INACTIVE subscriber 77ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo static const int BROADCAST_INACTIVE; 78ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 79ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // go to a specific subscriber 80ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo const Subscriber* rcver; 81ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // broadcast 82ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo const int groupID; 83ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // the new resource status event 84ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo const AgpsRsrcStatus rsrcStatus; 85ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // should the subscriber be deleted after the notification 86ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo const bool postNotifyDelete; 87ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 88ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // convenient constructor 89ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline Notification(const int broadcast, 90ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo const AgpsRsrcStatus status, 91ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo const bool deleteAfterwards) : 92ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo rcver(NULL), groupID(broadcast), rsrcStatus(status), 93ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo postNotifyDelete(deleteAfterwards) {} 94ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 95ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // convenient constructor 96ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline Notification(const Subscriber* subscriber, 97ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo const AgpsRsrcStatus status, 98ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo const bool deleteAfterwards) : 99ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo rcver(subscriber), groupID(-1), rsrcStatus(status), 100ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo postNotifyDelete(deleteAfterwards) {} 101ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 102ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // convenient constructor 103ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline Notification(const int broadcast) : 104ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo rcver(NULL), groupID(broadcast), rsrcStatus(RSRC_STATUS_MAX), 105ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo postNotifyDelete(false) {} 106ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 107ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // convenient constructor 108ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline Notification(const Subscriber* subscriber) : 109ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo rcver(subscriber), groupID(-1), rsrcStatus(RSRC_STATUS_MAX), 110ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo postNotifyDelete(false) {} 111ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}; 112ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 113ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoclass AgpsState { 114ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // allows AgpsStateMachine to access private data 115ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // no class members are public. We don't want 116ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // anyone but state machine to use state. 117ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo friend class AgpsStateMachine; 118ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo friend class DSStateMachine; 119ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // state transitions are done here. 120ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // Each state implements its own transitions (of course). 121ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual AgpsState* onRsrcEvent(AgpsRsrcStatus event, void* data) = 0; 122ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 123ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoprotected: 124ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // handle back to state machine 125ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo const AgpsStateMachine* mStateMachine; 126ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // each state has pointers to all 3 states 127ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // one of which is to itself. 128ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo AgpsState* mReleasedState; 129ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo AgpsState* mAcquiredState; 130ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo AgpsState* mPendingState; 131ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo AgpsState* mReleasingState; 132ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 133ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline AgpsState(const AgpsStateMachine *stateMachine) : 134ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo mStateMachine(stateMachine), 135ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo mReleasedState(NULL), 136ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo mAcquiredState(NULL), 137ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo mPendingState(NULL), 138ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo mReleasingState(NULL) {} 139ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual ~AgpsState() {} 140ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 141ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russopublic: 142ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // for logging purpose 143ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual char* whoami() = 0; 144ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}; 145ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 146ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoclass Servicer { 147ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo void (*callback)(void); 148ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russopublic: 149ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo static Servicer* getServicer(servicerType type, void *cb_func); 150ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual int requestRsrc(void *cb_data); 151ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo Servicer() {} 152ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo Servicer(void *cb_func) 153ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo { callback = (void(*)(void))(cb_func); } 154ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual ~Servicer(){} 155ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual char *whoami() {return (char*)"Servicer";} 156ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}; 157ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 158ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoclass ExtServicer : public Servicer { 159ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo int (*callbackExt)(void *cb_data); 160ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russopublic: 161ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo int requestRsrc(void *cb_data); 162ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo ExtServicer() {} 163ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo ExtServicer(void *cb_func) 164ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo { callbackExt = (int(*)(void *))(cb_func); } 165ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual ~ExtServicer(){} 166ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual char *whoami() {return (char*)"ExtServicer";} 167ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}; 168ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 169ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoclass AGpsServicer : public Servicer { 170ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo void (*callbackAGps)(AGpsStatus* status); 171ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russopublic: 172ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo int requestRsrc(void *cb_data); 173ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo AGpsServicer() {} 174ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo AGpsServicer(void *cb_func) 175ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo { callbackAGps = (void(*)(AGpsStatus *))(cb_func); } 176ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual ~AGpsServicer(){} 177ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual char *whoami() {return (char*)"AGpsServicer";} 178ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}; 179ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 180ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoclass AgpsStateMachine { 181ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoprotected: 182ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // a linked list of subscribers. 183ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo void* mSubscribers; 184ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo //handle to whoever provides the service 185ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo Servicer *mServicer; 186ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // allows AgpsState to access private data 187ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // each state is really internal data to the 188ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // state machine, so it should be able to 189ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // access anything within the state machine. 190ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo friend class AgpsState; 191ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // pointer to the current state. 192ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo AgpsState* mStatePtr; 193ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoprivate: 194ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // NIF type: AGNSS or INTERNET. 195ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo const AGpsExtType mType; 196ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // apn to the NIF. Each state machine tracks 197ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // resource state of a particular NIF. For each 198ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // NIF, there is also an active APN. 199ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo char* mAPN; 200ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // for convenience, we don't do strlen each time. 201ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo unsigned int mAPNLen; 202ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // bear 203ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo AGpsBearerType mBearer; 204ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // ipv4 address for routing 205ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo bool mEnforceSingleSubscriber; 206ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 207ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russopublic: 208ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo AgpsStateMachine(servicerType servType, void *cb_func, 209ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo AGpsExtType type, bool enforceSingleSubscriber); 210ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual ~AgpsStateMachine(); 211ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 212ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // self explanatory methods below 213ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo void setAPN(const char* apn, unsigned int len); 214ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline const char* getAPN() const { return (const char*)mAPN; } 215ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline void setBearer(AGpsBearerType bearer) { mBearer = bearer; } 216ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline AGpsBearerType getBearer() const { return mBearer; } 217ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline AGpsExtType getType() const { return (AGpsExtType)mType; } 218ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 219ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // someone, a ATL client or BIT, is asking for NIF 220ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo void subscribeRsrc(Subscriber *subscriber); 221ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 222ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // someone, a ATL client or BIT, is done with NIF 223ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo bool unsubscribeRsrc(Subscriber *subscriber); 224ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 225ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // add a subscriber in the linked list, if not already there. 226ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo void addSubscriber(Subscriber* subscriber) const; 227ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 228ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual void onRsrcEvent(AgpsRsrcStatus event); 229ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 230ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // put the data together and send the FW 231ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual int sendRsrcRequest(AGpsStatusValue action) const; 232ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 233ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo //if list is empty, linked_list_empty returns 1 234ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo //else if list is not empty, returns 0 235ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo //so hasSubscribers() returns 1 if list is not empty 236ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo //and returns 0 if list is empty 237ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline bool hasSubscribers() const 238ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo { return !linked_list_empty(mSubscribers); } 239ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 240ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo bool hasActiveSubscribers() const; 241ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 242ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline void dropAllSubscribers() const 243ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo { linked_list_flush(mSubscribers); } 244ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 245ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // private. Only a state gets to call this. 246ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo void notifySubscribers(Notification& notification) const; 247ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 248ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}; 249ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 250ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoclass DSStateMachine : public AgpsStateMachine { 251ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo static const unsigned char MAX_START_DATA_CALL_RETRIES; 252ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo static const unsigned int DATA_CALL_RETRY_DELAY_MSEC; 253ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo LocEngAdapter* mLocAdapter; 254ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo unsigned char mRetries; 255ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russopublic: 256ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo DSStateMachine(servicerType type, 257ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo void *cb_func, 258ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo LocEngAdapter* adapterHandle); 259ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo int sendRsrcRequest(AGpsStatusValue action) const; 260ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo void onRsrcEvent(AgpsRsrcStatus event); 261ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo void retryCallback(); 262ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo void informStatus(AgpsRsrcStatus status, int ID) const; 263ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline void incRetries() {mRetries++;} 264ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual char *whoami() {return (char*)"DSStateMachine";} 265ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}; 266ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 267ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo// each subscriber is a AGPS client. In the case of ATL, there could be 268ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo// multiple clients from modem. In the case of BIT, there is only one 269ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo// cilent from BIT daemon. 270ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russostruct Subscriber { 271ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo const uint32_t ID; 272ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo const AgpsStateMachine* mStateMachine; 273ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline Subscriber(const int id, 274ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo const AgpsStateMachine* stateMachine) : 275ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo ID(id), mStateMachine(stateMachine) {} 276ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual ~Subscriber() {} 277ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 278ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual void setIPAddresses(uint32_t &v4, char* v6) = 0; 279ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual void setWifiInfo(char* ssid, char* password) 280ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo { ssid[0] = 0; password[0] = 0; } 281ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 282ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual bool equals(const Subscriber *s) const 283ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo { return ID == s->ID; } 284ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 285ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // notifies a subscriber a new NIF resource status, usually 286ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // either GRANTE, DENIED, or RELEASED 287ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual bool notifyRsrcStatus(Notification ¬ification) = 0; 288ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 289ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual bool waitForCloseComplete() { return false; } 290ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual void setInactive() {} 291ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual bool isInactive() { return false; } 292ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 293ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual Subscriber* clone() = 0; 294ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // checks if this notification is for me, i.e. 295ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo // either has my id, or has a broadcast id. 296ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo bool forMe(Notification ¬ification); 297ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}; 298ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 299ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo// BITSubscriber, created with requests from BIT daemon 300ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russostruct BITSubscriber : public Subscriber { 301ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo char mIPv6Addr[16]; 302ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 303ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline BITSubscriber(const AgpsStateMachine* stateMachine, 304ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo unsigned int ipv4, char* ipv6) : 305ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo Subscriber(ipv4, stateMachine) 306ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo { 307ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo if (NULL == ipv6) { 308ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo mIPv6Addr[0] = 0; 309ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo } else { 310ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo memcpy(mIPv6Addr, ipv6, sizeof(mIPv6Addr)); 311ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo } 312ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo } 313ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 314ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual bool notifyRsrcStatus(Notification ¬ification); 315ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 316ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual void setIPAddresses(uint32_t &v4, char* v6) 317ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo { v4 = ID; memcpy(v6, mIPv6Addr, sizeof(mIPv6Addr)); } 318ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 319ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual Subscriber* clone() 320ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo { 321ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo return new BITSubscriber(mStateMachine, ID, mIPv6Addr); 322ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo } 323ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 324ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual bool equals(const Subscriber *s) const; 325ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual ~BITSubscriber(){} 326ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}; 327ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 328ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo// ATLSubscriber, created with requests from ATL 329ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russostruct ATLSubscriber : public Subscriber { 330ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo const LocEngAdapter* mLocAdapter; 331ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo const bool mBackwardCompatibleMode; 332ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline ATLSubscriber(const int id, 333ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo const AgpsStateMachine* stateMachine, 334ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo const LocEngAdapter* adapter, 335ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo const bool compatibleMode) : 336ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo Subscriber(id, stateMachine), mLocAdapter(adapter), 337ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo mBackwardCompatibleMode(compatibleMode){} 338ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual bool notifyRsrcStatus(Notification ¬ification); 339ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 340ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual void setIPAddresses(uint32_t &v4, char* v6) 341ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo { v4 = INADDR_NONE; v6[0] = 0; } 342ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 343ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual Subscriber* clone() 344ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo { 345ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo return new ATLSubscriber(ID, mStateMachine, mLocAdapter, 346ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo mBackwardCompatibleMode); 347ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo } 348ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual ~ATLSubscriber(){} 349ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}; 350ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 351ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo// WIFISubscriber, created with requests from MSAPM or QuIPC 352ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russostruct WIFISubscriber : public Subscriber { 353ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo char * mSSID; 354ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo char * mPassword; 355ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo loc_if_req_sender_id_e_type senderId; 356ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo bool mIsInactive; 357ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline WIFISubscriber(const AgpsStateMachine* stateMachine, 358ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo char * ssid, char * password, loc_if_req_sender_id_e_type sender_id) : 359ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo Subscriber(sender_id, stateMachine), 360ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo mSSID(NULL == ssid ? NULL : new char[SSID_BUF_SIZE]), 361ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo mPassword(NULL == password ? NULL : new char[SSID_BUF_SIZE]), 362ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo senderId(sender_id) 363ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo { 364ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo if (NULL != mSSID) 365ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo strlcpy(mSSID, ssid, SSID_BUF_SIZE); 366ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo if (NULL != mPassword) 367ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo strlcpy(mPassword, password, SSID_BUF_SIZE); 368ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo mIsInactive = false; 369ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo } 370ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 371ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual bool notifyRsrcStatus(Notification ¬ification); 372ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 373ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual void setIPAddresses(uint32_t &v4, char* v6) {} 374ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 375ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual void setWifiInfo(char* ssid, char* password) 376ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo { 377ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo if (NULL != mSSID) 378ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo strlcpy(ssid, mSSID, SSID_BUF_SIZE); 379ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo else 380ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo ssid[0] = '\0'; 381ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo if (NULL != mPassword) 382ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo strlcpy(password, mPassword, SSID_BUF_SIZE); 383ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo else 384ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo password[0] = '\0'; 385ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo } 386ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 387ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual bool waitForCloseComplete() { return true; } 388ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 389ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual void setInactive() { mIsInactive = true; } 390ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual bool isInactive() { return mIsInactive; } 391ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 392ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual Subscriber* clone() 393ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo { 394ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo return new WIFISubscriber(mStateMachine, mSSID, mPassword, senderId); 395ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo } 396ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual ~WIFISubscriber(){} 397ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}; 398ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 399ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russostruct DSSubscriber : public Subscriber { 400ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo bool mIsInactive; 401ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline DSSubscriber(const AgpsStateMachine *stateMachine, 402ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo const int id) : 403ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo Subscriber(id, stateMachine) 404ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo { 405ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo mIsInactive = false; 406ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo } 407ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual void setIPAddresses(uint32_t &v4, char* v6) {} 408ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual Subscriber* clone() 409ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo {return new DSSubscriber(mStateMachine, ID);} 410ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual bool notifyRsrcStatus(Notification ¬ification); 411ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual bool waitForCloseComplete() { return true; } 412ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo virtual void setInactive(); 413ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual bool isInactive() 414ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo { return mIsInactive; } 415ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual ~DSSubscriber(){} 416ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo inline virtual char *whoami() {return (char*)"DSSubscriber";} 417ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}; 418ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo 419ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#endif //__LOC_ENG_AGPS_H__ 420