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