14035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/* Copyright (c) 2009-2013, The Linux Foundation. All rights reserved. 24035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * 34035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * Redistribution and use in source and binary forms, with or without 44035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * modification, are permitted provided that the following conditions are 54035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * met: 64035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * * Redistributions of source code must retain the above copyright 74035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * notice, this list of conditions and the following disclaimer. 84035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * * Redistributions in binary form must reproduce the above 94035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * copyright notice, this list of conditions and the following 104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * disclaimer in the documentation and/or other materials provided 114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * with the distribution. 124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * * Neither the name of The Linux Foundation, nor the names of its 134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * contributors may be used to endorse or promote products derived 144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * from this software without specific prior written permission. 154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * 164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * 284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin */ 294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#define LOG_NDDEBUG 0 314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#define LOG_TAG "LocSvc_eng" 324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <loc_eng.h> 344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <MsgTask.h> 354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include "log_util.h" 364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include "platform_lib_includes.h" 374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinusing namespace loc_core; 394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstruct LocEngRequestXtraServer : public LocMsg { 414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LocEngAdapter* mAdapter; 424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin inline LocEngRequestXtraServer(LocEngAdapter* adapter) : 434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LocMsg(), mAdapter(adapter) 444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locallog(); 464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin inline virtual void proc() const { 484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin mAdapter->requestXtraServer(); 494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin inline void locallog() const { 514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGV("LocEngRequestXtraServer"); 524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin inline virtual void log() const { 544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locallog(); 554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}; 574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstruct LocEngInjectXtraData : public LocMsg { 594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LocEngAdapter* mAdapter; 604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin char* mData; 614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin const int mLen; 624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin inline LocEngInjectXtraData(LocEngAdapter* adapter, 634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin char* data, int len): 644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LocMsg(), mAdapter(adapter), 654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin mData(new char[len]), mLen(len) 664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin memcpy((void*)mData, (void*)data, len); 684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locallog(); 694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin inline ~LocEngInjectXtraData() 714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin { 724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin delete[] mData; 734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin inline virtual void proc() const { 754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin mAdapter->setXtraData(mData, mLen); 764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin inline void locallog() const { 784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGV("length: %d\n data: %p", mLen, mData); 794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin inline virtual void log() const { 814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locallog(); 824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}; 844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstruct LocEngSetXtraVersionCheck : public LocMsg { 864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LocEngAdapter *mAdapter; 874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int mCheck; 884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin inline LocEngSetXtraVersionCheck(LocEngAdapter* adapter, 894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int check): 904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin mAdapter(adapter), mCheck(check) {} 914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin inline virtual void proc() const { 924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locallog(); 934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin mAdapter->setXtraVersionCheck(mCheck); 944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin inline void locallog() const { 964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("%s:%d]: mCheck: %d", 974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin __func__, __LINE__, mCheck); 984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin inline virtual void log() const { 1004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin locallog(); 1014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 1024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}; 1034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*=========================================================================== 1054035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION loc_eng_xtra_init 1064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1074035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION 1084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin Initialize XTRA module. 1094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1104035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES 1114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin N/A 1124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1134035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE 1144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 0: success 1154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1164035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS 1174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin N/A 1184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/ 1204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint loc_eng_xtra_init (loc_eng_data_s_type &loc_eng_data, 1214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin GpsXtraExtCallbacks* callbacks) 1224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 1234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int ret_val = -1; 1244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin loc_eng_xtra_data_s_type *xtra_module_data_ptr; 1254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ENTRY_LOG(); 1264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 127e0bc79ad558c27738e4777f5c00745979aa703eeDante Russo if(!loc_eng_data.adapter->mSupportsTimeInjection 128e0bc79ad558c27738e4777f5c00745979aa703eeDante Russo || loc_eng_data.adapter->hasNativeXtraClient()) { 129e0bc79ad558c27738e4777f5c00745979aa703eeDante Russo LOC_LOGD("XTRA is already supported. disable it here.\n"); 130e0bc79ad558c27738e4777f5c00745979aa703eeDante Russo EXIT_LOG(%d, 1); // return 1 denote failure 131e0bc79ad558c27738e4777f5c00745979aa703eeDante Russo return 1; 132e0bc79ad558c27738e4777f5c00745979aa703eeDante Russo } 133e0bc79ad558c27738e4777f5c00745979aa703eeDante Russo 1344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if(callbacks == NULL) { 1354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGE("loc_eng_xtra_init: failed, cb is NULL"); 1364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } else { 1374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin xtra_module_data_ptr = &loc_eng_data.xtra_module_data; 1384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin xtra_module_data_ptr->download_request_cb = callbacks->download_request_cb; 1394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin xtra_module_data_ptr->report_xtra_server_cb = callbacks->report_xtra_server_cb; 1404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ret_val = 0; 1424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 1434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin EXIT_LOG(%d, ret_val); 1444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return ret_val; 1454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 1464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*=========================================================================== 1484035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION loc_eng_xtra_inject_data 1494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1504035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION 1514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin Injects XTRA file into the engine but buffers the data if engine is busy. 1524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1534035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES 1544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin N/A 1554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1564035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE 1574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 0 1584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1594035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS 1604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin N/A 1614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/ 1634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint loc_eng_xtra_inject_data(loc_eng_data_s_type &loc_eng_data, 1644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin char* data, int length) 1654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 1664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ENTRY_LOG(); 1674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LocEngAdapter* adapter = loc_eng_data.adapter; 1684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin adapter->sendMsg(new LocEngInjectXtraData(adapter, data, length)); 1694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin EXIT_LOG(%d, 0); 1704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return 0; 1714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 1724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*=========================================================================== 1734035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION loc_eng_xtra_request_server 1744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1754035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION 1764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin Request the Xtra server url from the modem 1774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1784035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES 1794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin N/A 1804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1814035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE 1824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 0 1834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1844035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS 1854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin N/A 1864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/ 1884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint loc_eng_xtra_request_server(loc_eng_data_s_type &loc_eng_data) 1894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 1904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ENTRY_LOG(); 1914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LocEngAdapter* adapter = loc_eng_data.adapter; 1924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin adapter->sendMsg(new LocEngRequestXtraServer(adapter)); 1934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin EXIT_LOG(%d, 0); 1944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return 0; 1954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 1964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*=========================================================================== 1974035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION loc_eng_xtra_version_check 1984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1994035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION 2004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin Injects the enable/disable value for checking XTRA version 2014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin that is specified in gps.conf 2024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2034035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES 2044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin N/A 2054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2064035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE 2074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin none 2084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2094035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS 2104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin N/A 2114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/ 2134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinvoid loc_eng_xtra_version_check(loc_eng_data_s_type &loc_eng_data, 2144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int check) 2154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 2164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ENTRY_LOG(); 2174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LocEngAdapter *adapter = loc_eng_data.adapter; 2184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin adapter->sendMsg(new LocEngSetXtraVersionCheck(adapter, check)); 2194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin EXIT_LOG(%d, 0); 2204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 221