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