1b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved.
2b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel *
3b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * Redistribution and use in source and binary forms, with or without
4b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * modification, are permitted provided that the following conditions are
5b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * met:
6b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel *     * Redistributions of source code must retain the above copyright
7b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel *       notice, this list of conditions and the following disclaimer.
8b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel *     * Redistributions in binary form must reproduce the above
9b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel *       copyright notice, this list of conditions and the following
10b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel *       disclaimer in the documentation and/or other materials provided
11b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel *       with the distribution.
12b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel *     * Neither the name of The Linux Foundation, nor the names of its
13b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel *       contributors may be used to endorse or promote products derived
14b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel *       from this software without specific prior written permission.
15b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel *
16b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel *
28b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel */
29b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
30b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel#ifndef AGPS_H
31b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel#define AGPS_H
32b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
33b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel#include <functional>
34b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel#include <list>
35b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel#include <MsgTask.h>
36b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel#include <gps_extended_c.h>
37b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel#include <platform_lib_log_util.h>
38b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
39b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel/* ATL callback function pointers
40b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * Passed in by Adapter to AgpsManager */
41b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudeltypedef std::function<void(
42b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        int handle, int isSuccess, char* apn,
43b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        AGpsBearerType bearerType, AGpsExtType agpsType)>  AgpsAtlOpenStatusCb;
44b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
45b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudeltypedef std::function<void(int handle, int isSuccess)>     AgpsAtlCloseStatusCb;
46b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
47b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel/* DS Client control APIs
48b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * Passed in by Adapter to AgpsManager */
49b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudeltypedef std::function<int(bool isDueToSSR)>  AgpsDSClientInitFn;
50b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudeltypedef std::function<int()>                 AgpsDSClientOpenAndStartDataCallFn;
51b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudeltypedef std::function<void()>                AgpsDSClientStopDataCallFn;
52b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudeltypedef std::function<void()>                AgpsDSClientCloseDataCallFn;
53b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudeltypedef std::function<void()>                AgpsDSClientReleaseFn;
54b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
55b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel/* Post message to adapter's message queue */
56b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudeltypedef std::function<void(LocMsg* msg)>     SendMsgToAdapterMsgQueueFn;
57b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
58b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel/* AGPS States */
59b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudeltypedef enum {
60b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AGPS_STATE_INVALID = 0,
61b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AGPS_STATE_RELEASED,
62b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AGPS_STATE_PENDING,
63b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AGPS_STATE_ACQUIRED,
64b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AGPS_STATE_RELEASING
65b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} AgpsState;
66b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
67b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudeltypedef enum {
68b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AGPS_EVENT_INVALID = 0,
69b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AGPS_EVENT_SUBSCRIBE,
70b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AGPS_EVENT_UNSUBSCRIBE,
71b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AGPS_EVENT_GRANTED,
72b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AGPS_EVENT_RELEASED,
73b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AGPS_EVENT_DENIED
74b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} AgpsEvent;
75b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
76b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel/* Notification Types sent to subscribers */
77b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudeltypedef enum {
78b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AGPS_NOTIFICATION_TYPE_INVALID = 0,
79b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
80b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Meant for all subscribers, either active or inactive */
81b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AGPS_NOTIFICATION_TYPE_FOR_ALL_SUBSCRIBERS,
82b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
83b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Meant for only inactive subscribers */
84b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AGPS_NOTIFICATION_TYPE_FOR_INACTIVE_SUBSCRIBERS,
85b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
86b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Meant for only active subscribers */
87b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AGPS_NOTIFICATION_TYPE_FOR_ACTIVE_SUBSCRIBERS
88b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} AgpsNotificationType;
89b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
90b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel/* Framework AGNSS interface
91b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * This interface is defined in IAGnssCallback provided by
92b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * Android Framework.
93b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * Must be kept in sync with that interface. */
94b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelnamespace AgpsFrameworkInterface {
95b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
96b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /** AGNSS type **/
97b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    enum AGnssType : uint8_t {
98b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        TYPE_SUPL         = 1,
99b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        TYPE_C2K          = 2
100b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    };
101b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
102b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    enum AGnssStatusValue : uint8_t {
103b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        /** GNSS requests data connection for AGNSS. */
104b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        REQUEST_AGNSS_DATA_CONN  = 1,
105b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        /** GNSS releases the AGNSS data connection. */
106b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        RELEASE_AGNSS_DATA_CONN  = 2,
107b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        /** AGNSS data connection initiated */
108b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        AGNSS_DATA_CONNECTED     = 3,
109b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        /** AGNSS data connection completed */
110b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        AGNSS_DATA_CONN_DONE     = 4,
111b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        /** AGNSS data connection failed */
112b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        AGNSS_DATA_CONN_FAILED   = 5
113b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    };
114b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
115b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /*
116b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * Represents the status of AGNSS augmented to support IPv4.
117b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     */
118b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    struct AGnssStatusIpV4 {
119b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        AGnssType type;
120b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        AGnssStatusValue status;
121b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        /*
122b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel         * 32-bit IPv4 address.
123b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel         */
124b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        unsigned int ipV4Addr;
125b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    };
126b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
127b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /*
128b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * Represents the status of AGNSS augmented to support IPv6.
129b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     */
130b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    struct AGnssStatusIpV6 {
131b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        AGnssType type;
132b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        AGnssStatusValue status;
133b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        /*
134b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel         * 128-bit IPv6 address.
135b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel         */
136b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        unsigned char ipV6Addr[16];
137b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    };
138b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
139b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /*
140b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * Callback with AGNSS(IpV4) status information.
141b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     *
142b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * @param status Will be of type AGnssStatusIpV4.
143b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     */
144b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    typedef void (*AgnssStatusIpV4Cb)(AGnssStatusIpV4 status);
145b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
146b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /*
147b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * Callback with AGNSS(IpV6) status information.
148b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     *
149b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * @param status Will be of type AGnssStatusIpV6.
150b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     */
151b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    typedef void (*AgnssStatusIpV6Cb)(AGnssStatusIpV6 status);
152b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel}
153b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
154b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel/* Classes in this header */
155b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelclass AgpsSubscriber;
156b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelclass AgpsManager;
157b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelclass AgpsStateMachine;
158b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelclass DSStateMachine;
159b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
160b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
161b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel/* SUBSCRIBER
162b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * Each Subscriber instance corresponds to one AGPS request,
163b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * received by the AGPS state machine */
164b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelclass AgpsSubscriber {
165b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
166b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelpublic:
167b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    int mConnHandle;
168b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
169b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Does this subscriber wait for data call close complete,
170b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * before being notified ATL close ?
171b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * While waiting for data call close, subscriber will be in
172b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * inactive state. */
173b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    bool mWaitForCloseComplete;
174b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    bool mIsInactive;
175b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
176b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    inline AgpsSubscriber(int connHandle) :
177b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            mConnHandle(connHandle), mWaitForCloseComplete(false),
178b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            mIsInactive(false) {}
179b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    inline virtual ~AgpsSubscriber() {}
180b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
181b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    inline virtual bool equals(const AgpsSubscriber *s) const
182b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    { return (mConnHandle == s->mConnHandle); }
183b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
184b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    inline virtual AgpsSubscriber* clone()
185b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    { return new AgpsSubscriber(mConnHandle); }
186b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel};
187b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
188b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel/* AGPS STATE MACHINE */
189b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelclass AgpsStateMachine {
190b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelprotected:
191b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* AGPS Manager instance, from where this state machine is created */
192b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsManager* mAgpsManager;
193b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
194b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* List of all subscribers for this State Machine.
195b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * Once a subscriber is notified for ATL open/close status,
196b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * it is deleted */
197b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    std::list<AgpsSubscriber*> mSubscriberList;
198b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
199b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Current subscriber, whose request this State Machine is
200b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * currently processing */
201b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsSubscriber* mCurrentSubscriber;
202b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
203b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Current state for this state machine */
204b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsState mState;
205b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
206b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelprivate:
207b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* AGPS Type for this state machine
208b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel       LOC_AGPS_TYPE_ANY           0
209b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel       LOC_AGPS_TYPE_SUPL          1
210b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel       LOC_AGPS_TYPE_WWAN_ANY      3
211b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel       LOC_AGPS_TYPE_SUPL_ES       5 */
212b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AGpsExtType mAgpsType;
213b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
214b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* APN and IP Type info for AGPS Call */
215b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    char* mAPN;
216b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    unsigned int mAPNLen;
217b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AGpsBearerType mBearer;
218b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
219b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelpublic:
220b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* CONSTRUCTOR */
221b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsStateMachine(AgpsManager* agpsManager, AGpsExtType agpsType):
222b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mAgpsManager(agpsManager), mSubscriberList(),
223b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mCurrentSubscriber(NULL), mState(AGPS_STATE_RELEASED),
224b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mAgpsType(agpsType), mAPN(NULL), mAPNLen(0),
225b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mBearer(AGPS_APN_BEARER_INVALID) {};
226b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
227b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    virtual ~AgpsStateMachine() { if(NULL != mAPN) delete[] mAPN; };
228b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
229b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Getter/Setter methods */
230b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void setAPN(char* apn, unsigned int len);
231b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    inline char* getAPN() const { return (char*)mAPN; }
232b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    inline void setBearer(AGpsBearerType bearer) { mBearer = bearer; }
233b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    inline AGpsBearerType getBearer() const { return mBearer; }
234b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    inline AGpsExtType getType() const { return mAgpsType; }
235b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    inline void setCurrentSubscriber(AgpsSubscriber* subscriber)
236b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    { mCurrentSubscriber = subscriber; }
237b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
238b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Fetch subscriber with specified handle */
239b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsSubscriber* getSubscriber(int connHandle);
240b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
241b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Fetch first active or inactive subscriber in list
242b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * isInactive = true : fetch first inactive subscriber
243b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * isInactive = false : fetch first active subscriber */
244b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsSubscriber* getFirstSubscriber(bool isInactive);
245b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
246b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Process LOC AGPS Event being passed in
247b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * onRsrcEvent */
248b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    virtual void processAgpsEvent(AgpsEvent event);
249b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
250b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Drop all subscribers, in case of Modem SSR */
251b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void dropAllSubscribers();
252b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
253b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelprotected:
254b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Remove the specified subscriber from list if present.
255b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * Also delete the subscriber instance. */
256b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void deleteSubscriber(AgpsSubscriber* subscriber);
257b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
258b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelprivate:
259b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Send call setup request to framework
260b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * sendRsrcRequest(LOC_GPS_REQUEST_AGPS_DATA_CONN)
261b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * sendRsrcRequest(LOC_GPS_RELEASE_AGPS_DATA_CONN) */
262b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    virtual int requestOrReleaseDataConn(bool request);
263b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
264b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Individual event processing methods */
265b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void processAgpsEventSubscribe();
266b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void processAgpsEventUnsubscribe();
267b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void processAgpsEventGranted();
268b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void processAgpsEventReleased();
269b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void processAgpsEventDenied();
270b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
271b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Clone the passed in subscriber and add to the subscriber list
272b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * if not already present */
273b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void addSubscriber(AgpsSubscriber* subscriber);
274b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
275b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Notify subscribers about AGPS events */
276b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void notifyAllSubscribers(
277b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsEvent event, bool deleteSubscriberPostNotify,
278b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsNotificationType notificationType);
279b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    virtual void notifyEventToSubscriber(
280b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsEvent event, AgpsSubscriber* subscriber,
281b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            bool deleteSubscriberPostNotify);
282b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
283b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Do we have any subscribers in active state */
284b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    bool anyActiveSubscribers();
285b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
286b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Transition state */
287b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void transitionState(AgpsState newState);
288b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel};
289b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
290b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel/* DS STATE MACHINE */
291b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelclass DSStateMachine : public AgpsStateMachine {
292b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
293b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelprivate:
294b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    static const int MAX_START_DATA_CALL_RETRIES;
295b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    static const int DATA_CALL_RETRY_DELAY_MSEC;
296b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
297b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    int mRetries;
298b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
299b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelpublic:
300b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* CONSTRUCTOR */
301b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    DSStateMachine(AgpsManager* agpsManager):
302b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        AgpsStateMachine(agpsManager, LOC_AGPS_TYPE_SUPL_ES), mRetries(0) {}
303b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
304b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Overridden method
305b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * DS SM needs to handle one event differently */
306b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void processAgpsEvent(AgpsEvent event);
307b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
308b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Retry callback, used in case call failure */
309b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void retryCallback();
310b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
311b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelprivate:
312b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Overridden method, different functionality for DS SM
313b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * Send call setup request to framework
314b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * sendRsrcRequest(LOC_GPS_REQUEST_AGPS_DATA_CONN)
315b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * sendRsrcRequest(LOC_GPS_RELEASE_AGPS_DATA_CONN) */
316b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    int requestOrReleaseDataConn(bool request);
317b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
318b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Overridden method, different functionality for DS SM */
319b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void notifyEventToSubscriber(
320b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsEvent event, AgpsSubscriber* subscriber,
321b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            bool deleteSubscriberPostNotify);
322b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel};
323b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
324b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel/* LOC AGPS MANAGER */
325b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelclass AgpsManager {
326b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
327b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    friend class AgpsStateMachine;
328b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    friend class DSStateMachine;
329b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
330b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelpublic:
331b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* CONSTRUCTOR */
332b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsManager():
333b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mFrameworkStatusV4Cb(NULL),
334b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mAtlOpenStatusCb(), mAtlCloseStatusCb(),
335b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mDSClientInitFn(), mDSClientOpenAndStartDataCallFn(),
336b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mDSClientStopDataCallFn(), mDSClientCloseDataCallFn(), mDSClientReleaseFn(),
337b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mSendMsgToAdapterQueueFn(),
338b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mAgnssNif(NULL), mInternetNif(NULL), mDsNif(NULL) {}
339b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
340b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Register callbacks */
341b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void registerCallbacks(
342b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsFrameworkInterface::AgnssStatusIpV4Cb
343b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel                                                frameworkStatusV4Cb,
344b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
345b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsAtlOpenStatusCb                 atlOpenStatusCb,
346b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsAtlCloseStatusCb                atlCloseStatusCb,
347b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
348b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsDSClientInitFn                  dsClientInitFn,
349b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsDSClientOpenAndStartDataCallFn  dsClientOpenAndStartDataCallFn,
350b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsDSClientStopDataCallFn          dsClientStopDataCallFn,
351b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsDSClientCloseDataCallFn         dsClientCloseDataCallFn,
352b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsDSClientReleaseFn               dsClientReleaseFn,
353b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
354b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            SendMsgToAdapterMsgQueueFn          sendMsgToAdapterQueueFn ){
355b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
356b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mFrameworkStatusV4Cb = frameworkStatusV4Cb;
357b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
358b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mAtlOpenStatusCb = atlOpenStatusCb;
359b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mAtlCloseStatusCb = atlCloseStatusCb;
360b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
361b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mDSClientInitFn = dsClientInitFn;
362b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mDSClientOpenAndStartDataCallFn = dsClientOpenAndStartDataCallFn;
363b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mDSClientStopDataCallFn = dsClientStopDataCallFn;
364b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mDSClientCloseDataCallFn = dsClientCloseDataCallFn;
365b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mDSClientReleaseFn = dsClientReleaseFn;
366b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
367b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mSendMsgToAdapterQueueFn = sendMsgToAdapterQueueFn;
368b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    }
369b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
370b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Create all AGPS state machines */
371b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void createAgpsStateMachines();
372b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
373b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Process incoming ATL requests */
374b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void requestATL(int connHandle, AGpsExtType agpsType);
375b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void releaseATL(int connHandle);
376b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
377b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Process incoming DS Client data call events */
378b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void reportDataCallOpened();
379b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void reportDataCallClosed();
380b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
381b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Process incoming framework data call events */
382b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void reportAtlOpenSuccess(
383b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AGpsExtType agpsType, char* apnName, int apnLen,
384b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            LocApnIpType ipType);
385b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void reportAtlOpenFailed(AGpsExtType agpsType);
386b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void reportAtlClosed(AGpsExtType agpsType);
387b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
388b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Handle Modem SSR */
389b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void handleModemSSR();
390b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
391b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelprotected:
392b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsFrameworkInterface::AgnssStatusIpV4Cb mFrameworkStatusV4Cb;
393b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
394b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsAtlOpenStatusCb   mAtlOpenStatusCb;
395b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsAtlCloseStatusCb  mAtlCloseStatusCb;
396b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
397b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsDSClientInitFn                  mDSClientInitFn;
398b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsDSClientOpenAndStartDataCallFn  mDSClientOpenAndStartDataCallFn;
399b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsDSClientStopDataCallFn          mDSClientStopDataCallFn;
400b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsDSClientCloseDataCallFn         mDSClientCloseDataCallFn;
401b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsDSClientReleaseFn               mDSClientReleaseFn;
402b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
403b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    SendMsgToAdapterMsgQueueFn          mSendMsgToAdapterQueueFn;
404b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
405b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsStateMachine*   mAgnssNif;
406b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsStateMachine*   mInternetNif;
407b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsStateMachine*   mDsNif;
408b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
409b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelprivate:
410b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Fetch state machine for handling request ATL call */
411b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsStateMachine* getAgpsStateMachine(AGpsExtType agpsType);
412b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel};
413b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
414b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel/* Request SUPL/INTERNET/SUPL_ES ATL
415b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * This LocMsg is defined in this header since it has to be used from more
416b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * than one place, other Agps LocMsg are restricted to GnssAdapter and
417b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * declared inline */
418b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelstruct AgpsMsgRequestATL: public LocMsg {
419b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
420b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsManager* mAgpsManager;
421b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    int mConnHandle;
422b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AGpsExtType mAgpsType;
423b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
424b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    inline AgpsMsgRequestATL(AgpsManager* agpsManager, int connHandle,
425b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AGpsExtType agpsType) :
426b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            LocMsg(), mAgpsManager(agpsManager), mConnHandle(connHandle), mAgpsType(
427b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel                    agpsType) {
428b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
429b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        LOC_LOGV("AgpsMsgRequestATL");
430b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    }
431b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
432b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    inline virtual void proc() const {
433b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
434b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        LOC_LOGV("AgpsMsgRequestATL::proc()");
435b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mAgpsManager->requestATL(mConnHandle, mAgpsType);
436b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    }
437b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel};
438b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
439b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelnamespace AgpsUtils {
440b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
441b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry StrudelAGpsBearerType ipTypeToBearerType(LocApnIpType ipType);
442b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry StrudelLocApnIpType bearerTypeToIpType(AGpsBearerType bearerType);
443b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
444b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel}
445b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
446b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel#endif /* AGPS_H */
447