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 &notification) = 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 &notification);
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 &notification);
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 &notification);
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