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