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