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
176338013142871f4617375d772f47015779debfc5dDante Russo    inline AgpsSubscriber(
177338013142871f4617375d772f47015779debfc5dDante Russo            int connHandle, bool waitForCloseComplete, bool isInactive) :
178338013142871f4617375d772f47015779debfc5dDante Russo            mConnHandle(connHandle),
179338013142871f4617375d772f47015779debfc5dDante Russo            mWaitForCloseComplete(waitForCloseComplete),
180338013142871f4617375d772f47015779debfc5dDante Russo            mIsInactive(isInactive) {}
181b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    inline virtual ~AgpsSubscriber() {}
182b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
183b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    inline virtual bool equals(const AgpsSubscriber *s) const
184b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    { return (mConnHandle == s->mConnHandle); }
185b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
186b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    inline virtual AgpsSubscriber* clone()
187338013142871f4617375d772f47015779debfc5dDante Russo    { return new AgpsSubscriber(
188338013142871f4617375d772f47015779debfc5dDante Russo            mConnHandle, mWaitForCloseComplete, mIsInactive); }
189b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel};
190b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
191b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel/* AGPS STATE MACHINE */
192b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelclass AgpsStateMachine {
193b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelprotected:
194b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* AGPS Manager instance, from where this state machine is created */
195b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsManager* mAgpsManager;
196b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
197b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* List of all subscribers for this State Machine.
198b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * Once a subscriber is notified for ATL open/close status,
199b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * it is deleted */
200b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    std::list<AgpsSubscriber*> mSubscriberList;
201b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
202b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Current subscriber, whose request this State Machine is
203b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * currently processing */
204b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsSubscriber* mCurrentSubscriber;
205b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
206b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Current state for this state machine */
207b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsState mState;
208b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
209b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelprivate:
210b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* AGPS Type for this state machine
211b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel       LOC_AGPS_TYPE_ANY           0
212b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel       LOC_AGPS_TYPE_SUPL          1
213b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel       LOC_AGPS_TYPE_WWAN_ANY      3
214b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel       LOC_AGPS_TYPE_SUPL_ES       5 */
215b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AGpsExtType mAgpsType;
216b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
217b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* APN and IP Type info for AGPS Call */
218b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    char* mAPN;
219b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    unsigned int mAPNLen;
220b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AGpsBearerType mBearer;
221b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
222b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelpublic:
223b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* CONSTRUCTOR */
224b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsStateMachine(AgpsManager* agpsManager, AGpsExtType agpsType):
225b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mAgpsManager(agpsManager), mSubscriberList(),
226b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mCurrentSubscriber(NULL), mState(AGPS_STATE_RELEASED),
227b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mAgpsType(agpsType), mAPN(NULL), mAPNLen(0),
228b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mBearer(AGPS_APN_BEARER_INVALID) {};
229b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
230b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    virtual ~AgpsStateMachine() { if(NULL != mAPN) delete[] mAPN; };
231b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
232b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Getter/Setter methods */
233b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void setAPN(char* apn, unsigned int len);
234b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    inline char* getAPN() const { return (char*)mAPN; }
235b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    inline void setBearer(AGpsBearerType bearer) { mBearer = bearer; }
236b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    inline AGpsBearerType getBearer() const { return mBearer; }
237b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    inline AGpsExtType getType() const { return mAgpsType; }
238b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    inline void setCurrentSubscriber(AgpsSubscriber* subscriber)
239b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    { mCurrentSubscriber = subscriber; }
240b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
241b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Fetch subscriber with specified handle */
242b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsSubscriber* getSubscriber(int connHandle);
243b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
244b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Fetch first active or inactive subscriber in list
245b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * isInactive = true : fetch first inactive subscriber
246b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * isInactive = false : fetch first active subscriber */
247b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsSubscriber* getFirstSubscriber(bool isInactive);
248b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
249b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Process LOC AGPS Event being passed in
250b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * onRsrcEvent */
251b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    virtual void processAgpsEvent(AgpsEvent event);
252b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
253b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Drop all subscribers, in case of Modem SSR */
254b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void dropAllSubscribers();
255b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
256b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelprotected:
257b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Remove the specified subscriber from list if present.
258b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * Also delete the subscriber instance. */
259b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void deleteSubscriber(AgpsSubscriber* subscriber);
260b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
261b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelprivate:
262b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Send call setup request to framework
263b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * sendRsrcRequest(LOC_GPS_REQUEST_AGPS_DATA_CONN)
264b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * sendRsrcRequest(LOC_GPS_RELEASE_AGPS_DATA_CONN) */
265b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    virtual int requestOrReleaseDataConn(bool request);
266b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
267b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Individual event processing methods */
268b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void processAgpsEventSubscribe();
269b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void processAgpsEventUnsubscribe();
270b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void processAgpsEventGranted();
271b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void processAgpsEventReleased();
272b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void processAgpsEventDenied();
273b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
274b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Clone the passed in subscriber and add to the subscriber list
275b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * if not already present */
276b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void addSubscriber(AgpsSubscriber* subscriber);
277b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
278b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Notify subscribers about AGPS events */
279b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void notifyAllSubscribers(
280b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsEvent event, bool deleteSubscriberPostNotify,
281b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsNotificationType notificationType);
282b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    virtual void notifyEventToSubscriber(
283b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsEvent event, AgpsSubscriber* subscriber,
284b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            bool deleteSubscriberPostNotify);
285b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
286b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Do we have any subscribers in active state */
287b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    bool anyActiveSubscribers();
288b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
289b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Transition state */
290b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void transitionState(AgpsState newState);
291b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel};
292b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
293b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel/* DS STATE MACHINE */
294b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelclass DSStateMachine : public AgpsStateMachine {
295b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
296b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelprivate:
297b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    static const int MAX_START_DATA_CALL_RETRIES;
298b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    static const int DATA_CALL_RETRY_DELAY_MSEC;
299b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
300b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    int mRetries;
301b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
302b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelpublic:
303b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* CONSTRUCTOR */
304b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    DSStateMachine(AgpsManager* agpsManager):
305b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        AgpsStateMachine(agpsManager, LOC_AGPS_TYPE_SUPL_ES), mRetries(0) {}
306b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
307b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Overridden method
308b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * DS SM needs to handle one event differently */
309b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void processAgpsEvent(AgpsEvent event);
310b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
311b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Retry callback, used in case call failure */
312b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void retryCallback();
313b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
314b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelprivate:
315b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Overridden method, different functionality for DS SM
316b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * Send call setup request to framework
317b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * sendRsrcRequest(LOC_GPS_REQUEST_AGPS_DATA_CONN)
318b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel     * sendRsrcRequest(LOC_GPS_RELEASE_AGPS_DATA_CONN) */
319b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    int requestOrReleaseDataConn(bool request);
320b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
321b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Overridden method, different functionality for DS SM */
322b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void notifyEventToSubscriber(
323b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsEvent event, AgpsSubscriber* subscriber,
324b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            bool deleteSubscriberPostNotify);
325b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel};
326b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
327b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel/* LOC AGPS MANAGER */
328b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelclass AgpsManager {
329b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
330b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    friend class AgpsStateMachine;
331b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    friend class DSStateMachine;
332b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
333b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelpublic:
334b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* CONSTRUCTOR */
335b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsManager():
336b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mFrameworkStatusV4Cb(NULL),
337b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mAtlOpenStatusCb(), mAtlCloseStatusCb(),
338b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mDSClientInitFn(), mDSClientOpenAndStartDataCallFn(),
339b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mDSClientStopDataCallFn(), mDSClientCloseDataCallFn(), mDSClientReleaseFn(),
340b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mSendMsgToAdapterQueueFn(),
341b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mAgnssNif(NULL), mInternetNif(NULL), mDsNif(NULL) {}
342b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
343b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Register callbacks */
344b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void registerCallbacks(
345b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsFrameworkInterface::AgnssStatusIpV4Cb
346b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel                                                frameworkStatusV4Cb,
347b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
348b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsAtlOpenStatusCb                 atlOpenStatusCb,
349b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsAtlCloseStatusCb                atlCloseStatusCb,
350b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
351b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsDSClientInitFn                  dsClientInitFn,
352b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsDSClientOpenAndStartDataCallFn  dsClientOpenAndStartDataCallFn,
353b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsDSClientStopDataCallFn          dsClientStopDataCallFn,
354b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsDSClientCloseDataCallFn         dsClientCloseDataCallFn,
355b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AgpsDSClientReleaseFn               dsClientReleaseFn,
356b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
357b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            SendMsgToAdapterMsgQueueFn          sendMsgToAdapterQueueFn ){
358b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
359b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mFrameworkStatusV4Cb = frameworkStatusV4Cb;
360b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
361b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mAtlOpenStatusCb = atlOpenStatusCb;
362b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mAtlCloseStatusCb = atlCloseStatusCb;
363b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
364b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mDSClientInitFn = dsClientInitFn;
365b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mDSClientOpenAndStartDataCallFn = dsClientOpenAndStartDataCallFn;
366b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mDSClientStopDataCallFn = dsClientStopDataCallFn;
367b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mDSClientCloseDataCallFn = dsClientCloseDataCallFn;
368b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mDSClientReleaseFn = dsClientReleaseFn;
369b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
370b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mSendMsgToAdapterQueueFn = sendMsgToAdapterQueueFn;
371b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    }
372b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
373b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Create all AGPS state machines */
374b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void createAgpsStateMachines();
375b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
376b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Process incoming ATL requests */
377b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void requestATL(int connHandle, AGpsExtType agpsType);
378b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void releaseATL(int connHandle);
379b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
380b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Process incoming DS Client data call events */
381b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void reportDataCallOpened();
382b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void reportDataCallClosed();
383b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
384b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Process incoming framework data call events */
385b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void reportAtlOpenSuccess(
386b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AGpsExtType agpsType, char* apnName, int apnLen,
387b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            LocApnIpType ipType);
388b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void reportAtlOpenFailed(AGpsExtType agpsType);
389b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void reportAtlClosed(AGpsExtType agpsType);
390b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
391b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Handle Modem SSR */
392b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    void handleModemSSR();
393b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
394b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelprotected:
395b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsFrameworkInterface::AgnssStatusIpV4Cb mFrameworkStatusV4Cb;
396b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
397b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsAtlOpenStatusCb   mAtlOpenStatusCb;
398b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsAtlCloseStatusCb  mAtlCloseStatusCb;
399b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
400b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsDSClientInitFn                  mDSClientInitFn;
401b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsDSClientOpenAndStartDataCallFn  mDSClientOpenAndStartDataCallFn;
402b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsDSClientStopDataCallFn          mDSClientStopDataCallFn;
403b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsDSClientCloseDataCallFn         mDSClientCloseDataCallFn;
404b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsDSClientReleaseFn               mDSClientReleaseFn;
405b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
406b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    SendMsgToAdapterMsgQueueFn          mSendMsgToAdapterQueueFn;
407b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
408b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsStateMachine*   mAgnssNif;
409b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsStateMachine*   mInternetNif;
410b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsStateMachine*   mDsNif;
411b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
412b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelprivate:
413b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    /* Fetch state machine for handling request ATL call */
414b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsStateMachine* getAgpsStateMachine(AGpsExtType agpsType);
415b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel};
416b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
417b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel/* Request SUPL/INTERNET/SUPL_ES ATL
418b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * This LocMsg is defined in this header since it has to be used from more
419b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * than one place, other Agps LocMsg are restricted to GnssAdapter and
420b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * declared inline */
421b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelstruct AgpsMsgRequestATL: public LocMsg {
422b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
423b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AgpsManager* mAgpsManager;
424b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    int mConnHandle;
425b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    AGpsExtType mAgpsType;
426b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
427b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    inline AgpsMsgRequestATL(AgpsManager* agpsManager, int connHandle,
428b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            AGpsExtType agpsType) :
429b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel            LocMsg(), mAgpsManager(agpsManager), mConnHandle(connHandle), mAgpsType(
430b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel                    agpsType) {
431b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
432b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        LOC_LOGV("AgpsMsgRequestATL");
433b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    }
434b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
435b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    inline virtual void proc() const {
436b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
437b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        LOC_LOGV("AgpsMsgRequestATL::proc()");
438b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel        mAgpsManager->requestATL(mConnHandle, mAgpsType);
439b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel    }
440b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel};
441b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
442b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelnamespace AgpsUtils {
443b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
444b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry StrudelAGpsBearerType ipTypeToBearerType(LocApnIpType ipType);
445b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry StrudelLocApnIpType bearerTypeToIpType(AGpsBearerType bearerType);
446b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
447b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel}
448b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel
449b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel#endif /* AGPS_H */
450