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