loc_eng_agps.h revision 34ee09551764b045fdc02df754157473125edf60
134ee09551764b045fdc02df754157473125edf60Kevin Tang/* Copyright (c) 2011, Code Aurora Forum. All rights reserved. 234ee09551764b045fdc02df754157473125edf60Kevin Tang * 334ee09551764b045fdc02df754157473125edf60Kevin Tang * Redistribution and use in source and binary forms, with or without 434ee09551764b045fdc02df754157473125edf60Kevin Tang * modification, are permitted provided that the following conditions are 534ee09551764b045fdc02df754157473125edf60Kevin Tang * met: 634ee09551764b045fdc02df754157473125edf60Kevin Tang * * Redistributions of source code must retain the above copyright 734ee09551764b045fdc02df754157473125edf60Kevin Tang * notice, this list of conditions and the following disclaimer. 834ee09551764b045fdc02df754157473125edf60Kevin Tang * * Redistributions in binary form must reproduce the above 934ee09551764b045fdc02df754157473125edf60Kevin Tang * copyright notice, this list of conditions and the following 1034ee09551764b045fdc02df754157473125edf60Kevin Tang * disclaimer in the documentation and/or other materials provided 1134ee09551764b045fdc02df754157473125edf60Kevin Tang * with the distribution. 1234ee09551764b045fdc02df754157473125edf60Kevin Tang * * Neither the name of Code Aurora Forum, Inc. nor the names of its 1334ee09551764b045fdc02df754157473125edf60Kevin Tang * contributors may be used to endorse or promote products derived 1434ee09551764b045fdc02df754157473125edf60Kevin Tang * from this software without specific prior written permission. 1534ee09551764b045fdc02df754157473125edf60Kevin Tang * 1634ee09551764b045fdc02df754157473125edf60Kevin Tang * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1734ee09551764b045fdc02df754157473125edf60Kevin Tang * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1834ee09551764b045fdc02df754157473125edf60Kevin Tang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 1934ee09551764b045fdc02df754157473125edf60Kevin Tang * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2034ee09551764b045fdc02df754157473125edf60Kevin Tang * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2134ee09551764b045fdc02df754157473125edf60Kevin Tang * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2234ee09551764b045fdc02df754157473125edf60Kevin Tang * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2334ee09551764b045fdc02df754157473125edf60Kevin Tang * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2434ee09551764b045fdc02df754157473125edf60Kevin Tang * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2534ee09551764b045fdc02df754157473125edf60Kevin Tang * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2634ee09551764b045fdc02df754157473125edf60Kevin Tang * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2734ee09551764b045fdc02df754157473125edf60Kevin Tang * 2834ee09551764b045fdc02df754157473125edf60Kevin Tang */ 2934ee09551764b045fdc02df754157473125edf60Kevin Tang 3034ee09551764b045fdc02df754157473125edf60Kevin Tang#ifndef __LOC_ENG_AGPS_H__ 3134ee09551764b045fdc02df754157473125edf60Kevin Tang#define __LOC_ENG_AGPS_H__ 3234ee09551764b045fdc02df754157473125edf60Kevin Tang 3334ee09551764b045fdc02df754157473125edf60Kevin Tang#include <stdbool.h> 3434ee09551764b045fdc02df754157473125edf60Kevin Tang#include <ctype.h> 3534ee09551764b045fdc02df754157473125edf60Kevin Tang#include <string.h> 3634ee09551764b045fdc02df754157473125edf60Kevin Tang#include <arpa/inet.h> 3734ee09551764b045fdc02df754157473125edf60Kevin Tang#include <hardware/gps.h> 3834ee09551764b045fdc02df754157473125edf60Kevin Tang#include <linked_list.h> 3934ee09551764b045fdc02df754157473125edf60Kevin Tang#include <LocApiAdapter.h> 4034ee09551764b045fdc02df754157473125edf60Kevin Tang 4134ee09551764b045fdc02df754157473125edf60Kevin Tang// forward declaration 4234ee09551764b045fdc02df754157473125edf60Kevin Tangclass AgpsStateMachine; 4334ee09551764b045fdc02df754157473125edf60Kevin Tangclass Subscriber; 4434ee09551764b045fdc02df754157473125edf60Kevin Tang 4534ee09551764b045fdc02df754157473125edf60Kevin Tang// NIF resource events 4634ee09551764b045fdc02df754157473125edf60Kevin Tangtypedef enum { 4734ee09551764b045fdc02df754157473125edf60Kevin Tang RSRC_SUBSCRIBE, 4834ee09551764b045fdc02df754157473125edf60Kevin Tang RSRC_UNSUBSCRIBE, 4934ee09551764b045fdc02df754157473125edf60Kevin Tang RSRC_GRANTED, 5034ee09551764b045fdc02df754157473125edf60Kevin Tang RSRC_RELEASED, 5134ee09551764b045fdc02df754157473125edf60Kevin Tang RSRC_DENIED, 5234ee09551764b045fdc02df754157473125edf60Kevin Tang RSRC_STATUS_MAX 5334ee09551764b045fdc02df754157473125edf60Kevin Tang} AgpsRsrcStatus; 5434ee09551764b045fdc02df754157473125edf60Kevin Tang 5534ee09551764b045fdc02df754157473125edf60Kevin Tang// information bundle for subscribers 5634ee09551764b045fdc02df754157473125edf60Kevin Tangstruct Notification { 5734ee09551764b045fdc02df754157473125edf60Kevin Tang // goes to every subscriber 5834ee09551764b045fdc02df754157473125edf60Kevin Tang static const int BROADCAST_ALL; 5934ee09551764b045fdc02df754157473125edf60Kevin Tang // goes to every ACTIVE subscriber 6034ee09551764b045fdc02df754157473125edf60Kevin Tang static const int BROADCAST_ACTIVE; 6134ee09551764b045fdc02df754157473125edf60Kevin Tang // goes to every INACTIVE subscriber 6234ee09551764b045fdc02df754157473125edf60Kevin Tang static const int BROADCAST_INACTIVE; 6334ee09551764b045fdc02df754157473125edf60Kevin Tang 6434ee09551764b045fdc02df754157473125edf60Kevin Tang // go to a specific subscriber 6534ee09551764b045fdc02df754157473125edf60Kevin Tang const Subscriber* rcver; 6634ee09551764b045fdc02df754157473125edf60Kevin Tang // broadcast 6734ee09551764b045fdc02df754157473125edf60Kevin Tang const int groupID; 6834ee09551764b045fdc02df754157473125edf60Kevin Tang // the new resource status event 6934ee09551764b045fdc02df754157473125edf60Kevin Tang const AgpsRsrcStatus rsrcStatus; 7034ee09551764b045fdc02df754157473125edf60Kevin Tang // should the subscriber be deleted after the notification 7134ee09551764b045fdc02df754157473125edf60Kevin Tang const bool postNotifyDelete; 7234ee09551764b045fdc02df754157473125edf60Kevin Tang 7334ee09551764b045fdc02df754157473125edf60Kevin Tang // convenient constructor 7434ee09551764b045fdc02df754157473125edf60Kevin Tang inline Notification(const int broadcast, 7534ee09551764b045fdc02df754157473125edf60Kevin Tang const AgpsRsrcStatus status, 7634ee09551764b045fdc02df754157473125edf60Kevin Tang const bool deleteAfterwards) : 7734ee09551764b045fdc02df754157473125edf60Kevin Tang rcver(NULL), groupID(broadcast), rsrcStatus(status), 7834ee09551764b045fdc02df754157473125edf60Kevin Tang postNotifyDelete(deleteAfterwards) {} 7934ee09551764b045fdc02df754157473125edf60Kevin Tang 8034ee09551764b045fdc02df754157473125edf60Kevin Tang // convenient constructor 8134ee09551764b045fdc02df754157473125edf60Kevin Tang inline Notification(const Subscriber* subscriber, 8234ee09551764b045fdc02df754157473125edf60Kevin Tang const AgpsRsrcStatus status, 8334ee09551764b045fdc02df754157473125edf60Kevin Tang const bool deleteAfterwards) : 8434ee09551764b045fdc02df754157473125edf60Kevin Tang rcver(subscriber), groupID(-1), rsrcStatus(status), 8534ee09551764b045fdc02df754157473125edf60Kevin Tang postNotifyDelete(deleteAfterwards) {} 8634ee09551764b045fdc02df754157473125edf60Kevin Tang 8734ee09551764b045fdc02df754157473125edf60Kevin Tang // convenient constructor 8834ee09551764b045fdc02df754157473125edf60Kevin Tang inline Notification(const int broadcast) : 8934ee09551764b045fdc02df754157473125edf60Kevin Tang rcver(NULL), groupID(broadcast), rsrcStatus(RSRC_STATUS_MAX), 9034ee09551764b045fdc02df754157473125edf60Kevin Tang postNotifyDelete(false) {} 9134ee09551764b045fdc02df754157473125edf60Kevin Tang 9234ee09551764b045fdc02df754157473125edf60Kevin Tang // convenient constructor 9334ee09551764b045fdc02df754157473125edf60Kevin Tang inline Notification(const Subscriber* subscriber) : 9434ee09551764b045fdc02df754157473125edf60Kevin Tang rcver(subscriber), groupID(-1), rsrcStatus(RSRC_STATUS_MAX), 9534ee09551764b045fdc02df754157473125edf60Kevin Tang postNotifyDelete(false) {} 9634ee09551764b045fdc02df754157473125edf60Kevin Tang}; 9734ee09551764b045fdc02df754157473125edf60Kevin Tang 9834ee09551764b045fdc02df754157473125edf60Kevin Tangclass AgpsState { 9934ee09551764b045fdc02df754157473125edf60Kevin Tang // allows AgpsStateMachine to access private data 10034ee09551764b045fdc02df754157473125edf60Kevin Tang // no class members are public. We don't want 10134ee09551764b045fdc02df754157473125edf60Kevin Tang // anyone but state machine to use state. 10234ee09551764b045fdc02df754157473125edf60Kevin Tang friend class AgpsStateMachine; 10334ee09551764b045fdc02df754157473125edf60Kevin Tang 10434ee09551764b045fdc02df754157473125edf60Kevin Tang // state transitions are done here. 10534ee09551764b045fdc02df754157473125edf60Kevin Tang // Each state implements its own transitions (of course). 10634ee09551764b045fdc02df754157473125edf60Kevin Tang inline virtual AgpsState* onRsrcEvent(AgpsRsrcStatus event, void* data) = 0; 10734ee09551764b045fdc02df754157473125edf60Kevin Tang 10834ee09551764b045fdc02df754157473125edf60Kevin Tangprotected: 10934ee09551764b045fdc02df754157473125edf60Kevin Tang // handle back to state machine 11034ee09551764b045fdc02df754157473125edf60Kevin Tang const AgpsStateMachine* mStateMachine; 11134ee09551764b045fdc02df754157473125edf60Kevin Tang // each state has pointers to all 3 states 11234ee09551764b045fdc02df754157473125edf60Kevin Tang // one of which is to itself. 11334ee09551764b045fdc02df754157473125edf60Kevin Tang AgpsState* mReleasedState; 11434ee09551764b045fdc02df754157473125edf60Kevin Tang AgpsState* mAcquiredState; 11534ee09551764b045fdc02df754157473125edf60Kevin Tang AgpsState* mPendingState; 11634ee09551764b045fdc02df754157473125edf60Kevin Tang AgpsState* mReleasingState; 11734ee09551764b045fdc02df754157473125edf60Kevin Tang 11834ee09551764b045fdc02df754157473125edf60Kevin Tang inline AgpsState(const AgpsStateMachine *stateMachine) : 11934ee09551764b045fdc02df754157473125edf60Kevin Tang mStateMachine(stateMachine), 12034ee09551764b045fdc02df754157473125edf60Kevin Tang mReleasedState(NULL), 12134ee09551764b045fdc02df754157473125edf60Kevin Tang mAcquiredState(NULL), 12234ee09551764b045fdc02df754157473125edf60Kevin Tang mPendingState(NULL), 12334ee09551764b045fdc02df754157473125edf60Kevin Tang mReleasingState(NULL) {} 12434ee09551764b045fdc02df754157473125edf60Kevin Tang virtual ~AgpsState() {} 12534ee09551764b045fdc02df754157473125edf60Kevin Tang 12634ee09551764b045fdc02df754157473125edf60Kevin Tangpublic: 12734ee09551764b045fdc02df754157473125edf60Kevin Tang // for logging purpose 12834ee09551764b045fdc02df754157473125edf60Kevin Tang inline virtual char* whoami() = 0; 12934ee09551764b045fdc02df754157473125edf60Kevin Tang}; 13034ee09551764b045fdc02df754157473125edf60Kevin Tang 13134ee09551764b045fdc02df754157473125edf60Kevin Tangclass AgpsStateMachine { 13234ee09551764b045fdc02df754157473125edf60Kevin Tang // allows AgpsState to access private data 13334ee09551764b045fdc02df754157473125edf60Kevin Tang // each state is really internal data to the 13434ee09551764b045fdc02df754157473125edf60Kevin Tang // state machine, so it should be able to 13534ee09551764b045fdc02df754157473125edf60Kevin Tang // access anything within the state machine. 13634ee09551764b045fdc02df754157473125edf60Kevin Tang friend class AgpsState; 13734ee09551764b045fdc02df754157473125edf60Kevin Tang 13834ee09551764b045fdc02df754157473125edf60Kevin Tang // handle to whoever provides the service 13934ee09551764b045fdc02df754157473125edf60Kevin Tang void (* const mServicer)(AGpsStatus* status); 14034ee09551764b045fdc02df754157473125edf60Kevin Tang // NIF type: AGNSS or INTERNET. 14134ee09551764b045fdc02df754157473125edf60Kevin Tang const AGpsType mType; 14234ee09551764b045fdc02df754157473125edf60Kevin Tang // pointer to the current state. 14334ee09551764b045fdc02df754157473125edf60Kevin Tang AgpsState* mStatePtr; 14434ee09551764b045fdc02df754157473125edf60Kevin Tang // a linked list of subscribers. 14534ee09551764b045fdc02df754157473125edf60Kevin Tang void* mSubscribers; 14634ee09551764b045fdc02df754157473125edf60Kevin Tang // apn to the NIF. Each state machine tracks 14734ee09551764b045fdc02df754157473125edf60Kevin Tang // resource state of a particular NIF. For each 14834ee09551764b045fdc02df754157473125edf60Kevin Tang // NIF, there is also an active APN. 14934ee09551764b045fdc02df754157473125edf60Kevin Tang char* mAPN; 15034ee09551764b045fdc02df754157473125edf60Kevin Tang // for convenience, we don't do strlen each time. 15134ee09551764b045fdc02df754157473125edf60Kevin Tang unsigned int mAPNLen; 15234ee09551764b045fdc02df754157473125edf60Kevin Tang#ifdef QCOM_FEATURE_IPV6 15334ee09551764b045fdc02df754157473125edf60Kevin Tang // bear 15434ee09551764b045fdc02df754157473125edf60Kevin Tang AGpsBearerType mBearer; 15534ee09551764b045fdc02df754157473125edf60Kevin Tang#endif 15634ee09551764b045fdc02df754157473125edf60Kevin Tang // ipv4 address for routing 15734ee09551764b045fdc02df754157473125edf60Kevin Tang 15834ee09551764b045fdc02df754157473125edf60Kevin Tangpublic: 15934ee09551764b045fdc02df754157473125edf60Kevin Tang AgpsStateMachine(void (*servicer)(AGpsStatus* status), AGpsType type); 16034ee09551764b045fdc02df754157473125edf60Kevin Tang virtual ~AgpsStateMachine(); 16134ee09551764b045fdc02df754157473125edf60Kevin Tang 16234ee09551764b045fdc02df754157473125edf60Kevin Tang // self explanatory methods below 16334ee09551764b045fdc02df754157473125edf60Kevin Tang void setAPN(const char* apn, unsigned int len); 16434ee09551764b045fdc02df754157473125edf60Kevin Tang inline const char* getAPN() const { return (const char*)mAPN; } 16534ee09551764b045fdc02df754157473125edf60Kevin Tang#ifdef QCOM_FEATURE_IPV6 16634ee09551764b045fdc02df754157473125edf60Kevin Tang inline void setBearer(AGpsBearerType bearer) { mBearer = bearer; } 16734ee09551764b045fdc02df754157473125edf60Kevin Tang inline AGpsBearerType getBearer() const { return mBearer; } 16834ee09551764b045fdc02df754157473125edf60Kevin Tang#endif 16934ee09551764b045fdc02df754157473125edf60Kevin Tang inline AGpsType getType() const { return (AGpsType)mType; } 17034ee09551764b045fdc02df754157473125edf60Kevin Tang 17134ee09551764b045fdc02df754157473125edf60Kevin Tang // someone, a ATL client or BIT, is asking for NIF 17234ee09551764b045fdc02df754157473125edf60Kevin Tang void subscribeRsrc(Subscriber *subscriber); 17334ee09551764b045fdc02df754157473125edf60Kevin Tang 17434ee09551764b045fdc02df754157473125edf60Kevin Tang // someone, a ATL client or BIT, is done with NIF 17534ee09551764b045fdc02df754157473125edf60Kevin Tang bool unsubscribeRsrc(Subscriber *subscriber); 17634ee09551764b045fdc02df754157473125edf60Kevin Tang 17734ee09551764b045fdc02df754157473125edf60Kevin Tang // add a subscriber in the linked list, if not already there. 17834ee09551764b045fdc02df754157473125edf60Kevin Tang void addSubscriber(Subscriber* subscriber) const; 17934ee09551764b045fdc02df754157473125edf60Kevin Tang 18034ee09551764b045fdc02df754157473125edf60Kevin Tang void onRsrcEvent(AgpsRsrcStatus event); 18134ee09551764b045fdc02df754157473125edf60Kevin Tang 18234ee09551764b045fdc02df754157473125edf60Kevin Tang // put the data together and send the FW 18334ee09551764b045fdc02df754157473125edf60Kevin Tang void sendRsrcRequest(AGpsStatusValue action) const; 18434ee09551764b045fdc02df754157473125edf60Kevin Tang 18534ee09551764b045fdc02df754157473125edf60Kevin Tang inline bool hasSubscribers() const 18634ee09551764b045fdc02df754157473125edf60Kevin Tang { return !linked_list_empty(mSubscribers); } 18734ee09551764b045fdc02df754157473125edf60Kevin Tang 18834ee09551764b045fdc02df754157473125edf60Kevin Tang bool hasActiveSubscribers() const; 18934ee09551764b045fdc02df754157473125edf60Kevin Tang 19034ee09551764b045fdc02df754157473125edf60Kevin Tang inline void dropAllSubscribers() const 19134ee09551764b045fdc02df754157473125edf60Kevin Tang { linked_list_flush(mSubscribers); } 19234ee09551764b045fdc02df754157473125edf60Kevin Tang 19334ee09551764b045fdc02df754157473125edf60Kevin Tang // private. Only a state gets to call this. 19434ee09551764b045fdc02df754157473125edf60Kevin Tang void notifySubscribers(Notification& notification) const; 19534ee09551764b045fdc02df754157473125edf60Kevin Tang}; 19634ee09551764b045fdc02df754157473125edf60Kevin Tang 19734ee09551764b045fdc02df754157473125edf60Kevin Tang// each subscriber is a AGPS client. In the case of ATL, there could be 19834ee09551764b045fdc02df754157473125edf60Kevin Tang// multiple clients from modem. In the case of BIT, there is only one 19934ee09551764b045fdc02df754157473125edf60Kevin Tang// cilent from BIT daemon. 20034ee09551764b045fdc02df754157473125edf60Kevin Tangstruct Subscriber { 20134ee09551764b045fdc02df754157473125edf60Kevin Tang const int ID; 20234ee09551764b045fdc02df754157473125edf60Kevin Tang const AgpsStateMachine* mStateMachine; 20334ee09551764b045fdc02df754157473125edf60Kevin Tang inline Subscriber(const int id, 20434ee09551764b045fdc02df754157473125edf60Kevin Tang const AgpsStateMachine* stateMachine) : 20534ee09551764b045fdc02df754157473125edf60Kevin Tang ID(id), mStateMachine(stateMachine) {} 20634ee09551764b045fdc02df754157473125edf60Kevin Tang inline virtual ~Subscriber() {} 20734ee09551764b045fdc02df754157473125edf60Kevin Tang 20834ee09551764b045fdc02df754157473125edf60Kevin Tang virtual void setIPAddresses(int &v4, char* v6) = 0; 20934ee09551764b045fdc02df754157473125edf60Kevin Tang 21034ee09551764b045fdc02df754157473125edf60Kevin Tang inline virtual bool equals(const Subscriber *s) const 21134ee09551764b045fdc02df754157473125edf60Kevin Tang { return ID == s->ID; } 21234ee09551764b045fdc02df754157473125edf60Kevin Tang 21334ee09551764b045fdc02df754157473125edf60Kevin Tang // notifies a subscriber a new NIF resource status, usually 21434ee09551764b045fdc02df754157473125edf60Kevin Tang // either GRANTE, DENIED, or RELEASED 21534ee09551764b045fdc02df754157473125edf60Kevin Tang virtual bool notifyRsrcStatus(Notification ¬ification) = 0; 21634ee09551764b045fdc02df754157473125edf60Kevin Tang 21734ee09551764b045fdc02df754157473125edf60Kevin Tang virtual bool waitForCloseComplete() { return false; } 21834ee09551764b045fdc02df754157473125edf60Kevin Tang virtual void setInactive() {} 21934ee09551764b045fdc02df754157473125edf60Kevin Tang virtual bool isInactive() { return false; } 22034ee09551764b045fdc02df754157473125edf60Kevin Tang 22134ee09551764b045fdc02df754157473125edf60Kevin Tang virtual Subscriber* clone() = 0; 22234ee09551764b045fdc02df754157473125edf60Kevin Tang // checks if this notification is for me, i.e. 22334ee09551764b045fdc02df754157473125edf60Kevin Tang // either has my id, or has a broadcast id. 22434ee09551764b045fdc02df754157473125edf60Kevin Tang bool forMe(Notification ¬ification); 22534ee09551764b045fdc02df754157473125edf60Kevin Tang}; 22634ee09551764b045fdc02df754157473125edf60Kevin Tang 22734ee09551764b045fdc02df754157473125edf60Kevin Tang// BITSubscriber, created with requests from BIT daemon 22834ee09551764b045fdc02df754157473125edf60Kevin Tangstruct BITSubscriber : public Subscriber { 22934ee09551764b045fdc02df754157473125edf60Kevin Tang inline BITSubscriber(const AgpsStateMachine* stateMachine, 23034ee09551764b045fdc02df754157473125edf60Kevin Tang unsigned int ipv4, char* ipv6) : 23134ee09551764b045fdc02df754157473125edf60Kevin Tang Subscriber(ipv4, stateMachine) 23234ee09551764b045fdc02df754157473125edf60Kevin Tang { 23334ee09551764b045fdc02df754157473125edf60Kevin Tang if (NULL == ipv6) { 23434ee09551764b045fdc02df754157473125edf60Kevin Tang ipv6Addr[0] = NULL; 23534ee09551764b045fdc02df754157473125edf60Kevin Tang } else { 23634ee09551764b045fdc02df754157473125edf60Kevin Tang memcpy(ipv6Addr, ipv6, sizeof(ipv6Addr)); 23734ee09551764b045fdc02df754157473125edf60Kevin Tang } 23834ee09551764b045fdc02df754157473125edf60Kevin Tang } 23934ee09551764b045fdc02df754157473125edf60Kevin Tang 24034ee09551764b045fdc02df754157473125edf60Kevin Tang virtual bool notifyRsrcStatus(Notification ¬ification); 24134ee09551764b045fdc02df754157473125edf60Kevin Tang 24234ee09551764b045fdc02df754157473125edf60Kevin Tang inline virtual void setIPAddresses(int &v4, char* v6) 24334ee09551764b045fdc02df754157473125edf60Kevin Tang { v4 = ID; memcpy(v6, ipv6Addr, sizeof(ipv6Addr)); } 24434ee09551764b045fdc02df754157473125edf60Kevin Tang 24534ee09551764b045fdc02df754157473125edf60Kevin Tang virtual Subscriber* clone() 24634ee09551764b045fdc02df754157473125edf60Kevin Tang { 24734ee09551764b045fdc02df754157473125edf60Kevin Tang return new BITSubscriber(mStateMachine, ID, ipv6Addr); 24834ee09551764b045fdc02df754157473125edf60Kevin Tang } 24934ee09551764b045fdc02df754157473125edf60Kevin Tang 25034ee09551764b045fdc02df754157473125edf60Kevin Tang virtual bool equals(const Subscriber *s) const; 25134ee09551764b045fdc02df754157473125edf60Kevin Tang 25234ee09551764b045fdc02df754157473125edf60Kevin Tangprivate: 25334ee09551764b045fdc02df754157473125edf60Kevin Tang char ipv6Addr[16]; 25434ee09551764b045fdc02df754157473125edf60Kevin Tang}; 25534ee09551764b045fdc02df754157473125edf60Kevin Tang 25634ee09551764b045fdc02df754157473125edf60Kevin Tang// ATLSubscriber, created with requests from ATL 25734ee09551764b045fdc02df754157473125edf60Kevin Tangstruct ATLSubscriber : public Subscriber { 25834ee09551764b045fdc02df754157473125edf60Kevin Tang const LocApiAdapter* mLocAdapter; 25934ee09551764b045fdc02df754157473125edf60Kevin Tang inline ATLSubscriber(const int id, 26034ee09551764b045fdc02df754157473125edf60Kevin Tang const AgpsStateMachine* stateMachine, 26134ee09551764b045fdc02df754157473125edf60Kevin Tang const LocApiAdapter* adapter) : 26234ee09551764b045fdc02df754157473125edf60Kevin Tang Subscriber(id, stateMachine), mLocAdapter(adapter) {} 26334ee09551764b045fdc02df754157473125edf60Kevin Tang virtual bool notifyRsrcStatus(Notification ¬ification); 26434ee09551764b045fdc02df754157473125edf60Kevin Tang 26534ee09551764b045fdc02df754157473125edf60Kevin Tang inline virtual void setIPAddresses(int &v4, char* v6) 26634ee09551764b045fdc02df754157473125edf60Kevin Tang { v4 = INADDR_NONE; v6[0] = 0; } 26734ee09551764b045fdc02df754157473125edf60Kevin Tang 26834ee09551764b045fdc02df754157473125edf60Kevin Tang inline virtual Subscriber* clone() 26934ee09551764b045fdc02df754157473125edf60Kevin Tang { 27034ee09551764b045fdc02df754157473125edf60Kevin Tang return new ATLSubscriber(ID, mStateMachine, mLocAdapter); 27134ee09551764b045fdc02df754157473125edf60Kevin Tang } 27234ee09551764b045fdc02df754157473125edf60Kevin Tang}; 27334ee09551764b045fdc02df754157473125edf60Kevin Tang 27434ee09551764b045fdc02df754157473125edf60Kevin Tang#endif //__LOC_ENG_AGPS_H__ 275