14035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/* Copyright (c) 2011-2014, 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#define LOG_NDDEBUG 0
304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#define LOG_TAG "LocSvc_CtxBase"
314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <dlfcn.h>
334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <cutils/sched_policy.h>
344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <unistd.h>
354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <ContextBase.h>
364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <msg_q.h>
374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <loc_target.h>
384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <log_util.h>
394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <loc_log.h>
404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinnamespace loc_core {
424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
438cf3e0e4ddbbb98ddf51be7685bcea37b32cfabeDante Russoloc_gps_cfg_s_type ContextBase::mGps_conf {0};
448cf3e0e4ddbbb98ddf51be7685bcea37b32cfabeDante Russoloc_sap_cfg_s_type ContextBase::mSap_conf {0};
458cf3e0e4ddbbb98ddf51be7685bcea37b32cfabeDante Russo
468cf3e0e4ddbbb98ddf51be7685bcea37b32cfabeDante Russouint32_t ContextBase::getCarrierCapabilities() {
478cf3e0e4ddbbb98ddf51be7685bcea37b32cfabeDante Russo    #define carrierMSA (uint32_t)0x2
488cf3e0e4ddbbb98ddf51be7685bcea37b32cfabeDante Russo    #define carrierMSB (uint32_t)0x1
498cf3e0e4ddbbb98ddf51be7685bcea37b32cfabeDante Russo    #define gpsConfMSA (uint32_t)0x4
508cf3e0e4ddbbb98ddf51be7685bcea37b32cfabeDante Russo    #define gpsConfMSB (uint32_t)0x2
518cf3e0e4ddbbb98ddf51be7685bcea37b32cfabeDante Russo    uint32_t capabilities = mGps_conf.CAPABILITIES;
528cf3e0e4ddbbb98ddf51be7685bcea37b32cfabeDante Russo    if ((mGps_conf.SUPL_MODE & carrierMSA) != carrierMSA) {
538cf3e0e4ddbbb98ddf51be7685bcea37b32cfabeDante Russo        capabilities &= ~gpsConfMSA;
548cf3e0e4ddbbb98ddf51be7685bcea37b32cfabeDante Russo    }
558cf3e0e4ddbbb98ddf51be7685bcea37b32cfabeDante Russo    if ((mGps_conf.SUPL_MODE & carrierMSB) != carrierMSB) {
568cf3e0e4ddbbb98ddf51be7685bcea37b32cfabeDante Russo        capabilities &= ~gpsConfMSB;
578cf3e0e4ddbbb98ddf51be7685bcea37b32cfabeDante Russo    }
588cf3e0e4ddbbb98ddf51be7685bcea37b32cfabeDante Russo
598cf3e0e4ddbbb98ddf51be7685bcea37b32cfabeDante Russo    LOC_LOGV("getCarrierCapabilities: CAPABILITIES %x, SUPL_MODE %x, carrier capabilities %x",
608cf3e0e4ddbbb98ddf51be7685bcea37b32cfabeDante Russo             mGps_conf.CAPABILITIES, mGps_conf.SUPL_MODE, capabilities);
618cf3e0e4ddbbb98ddf51be7685bcea37b32cfabeDante Russo    return capabilities;
628cf3e0e4ddbbb98ddf51be7685bcea37b32cfabeDante Russo}
638cf3e0e4ddbbb98ddf51be7685bcea37b32cfabeDante Russo
644035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLBSProxyBase* ContextBase::getLBSProxy(const char* libName)
654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LBSProxyBase* proxy = NULL;
674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_LOGD("%s:%d]: getLBSProxy libname: %s\n", __func__, __LINE__, libName);
684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    void* lib = dlopen(libName, RTLD_NOW);
694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if ((void*)NULL != lib) {
714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        getLBSProxy_t* getter = (getLBSProxy_t*)dlsym(lib, "getLBSProxy");
724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (NULL != getter) {
734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            proxy = (*getter)();
744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (NULL == proxy) {
774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        proxy = new LBSProxyBase();
784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_LOGD("%s:%d]: Exiting\n", __func__, __LINE__);
804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return proxy;
814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
834035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinLocApiBase* ContextBase::createLocApi(LOC_API_ADAPTER_EVENT_MASK_T exMask)
844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LocApiBase* locApi = NULL;
864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // first if can not be MPQ
884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (TARGET_MPQ != loc_get_target()) {
894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        if (NULL == (locApi = mLBSProxy->getLocApi(mMsgTask, exMask, this))) {
904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            void *handle = NULL;
914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            //try to see if LocApiV02 is present
924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            if((handle = dlopen("libloc_api_v02.so", RTLD_NOW)) != NULL) {
934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                LOC_LOGD("%s:%d]: libloc_api_v02.so is present", __func__, __LINE__);
944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                getLocApi_t* getter = (getLocApi_t*)dlsym(handle, "getLocApi");
954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                if(getter != NULL) {
964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    LOC_LOGD("%s:%d]: getter is not NULL for LocApiV02", __func__, __LINE__);
974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    locApi = (*getter)(mMsgTask, exMask, this);
984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                }
994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            }
1004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            // only RPC is the option now
1014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            else {
1024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                LOC_LOGD("%s:%d]: libloc_api_v02.so is NOT present. Trying RPC",
1034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                         __func__, __LINE__);
1044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                handle = dlopen("libloc_api-rpc-qc.so", RTLD_NOW);
1054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                if (NULL != handle) {
1064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    getLocApi_t* getter = (getLocApi_t*)dlsym(handle, "getLocApi");
1074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    if (NULL != getter) {
1084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                        LOC_LOGD("%s:%d]: getter is not NULL in RPC", __func__, __LINE__);
1094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                        locApi = (*getter)(mMsgTask, exMask, this);
1104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                    }
1114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                }
1124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin            }
1134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        }
1144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
1154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // locApi could still be NULL at this time
1174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // we would then create a dummy one
1184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (NULL == locApi) {
1194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        locApi = new LocApiBase(mMsgTask, exMask, this);
1204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
1214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return locApi;
1234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
1244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1254035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinContextBase::ContextBase(const MsgTask* msgTask,
1264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                         LOC_API_ADAPTER_EVENT_MASK_T exMask,
1274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                         const char* libName) :
1284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    mLBSProxy(getLBSProxy(libName)),
1294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    mMsgTask(msgTask),
1304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    mLocApi(createLocApi(exMask)),
1314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    mLocApiProxy(mLocApi->getLocApiProxy())
1324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
1334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
1344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
136