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