18c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved.
28c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *
38c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * Redistribution and use in source and binary forms, with or without
48c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * modification, are permitted provided that the following conditions are
58c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * met:
68c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *     * Redistributions of source code must retain the above copyright
78c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *       notice, this list of conditions and the following disclaimer.
88c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *     * Redistributions in binary form must reproduce the above
98c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *       copyright notice, this list of conditions and the following
108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *       disclaimer in the documentation and/or other materials provided
118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *       with the distribution.
128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *     * Neither the name of The Linux Foundation, nor the names of its
138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *       contributors may be used to endorse or promote products derived
148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *       from this software without specific prior written permission.
158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *
168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *
288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam */
298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define LOG_NDDEBUG 0
308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define LOG_TAG "LocSvc_CtxBase"
318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <dlfcn.h>
338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <cutils/sched_policy.h>
348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <unistd.h>
358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <ContextBase.h>
368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <msg_q.h>
378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <loc_target.h>
388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <log_util.h>
398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <loc_log.h>
408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
418c2d3d5afc51d3f35150f748f263870367771b6fEd Tamnamespace loc_core {
428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
438c2d3d5afc51d3f35150f748f263870367771b6fEd TamLBSProxyBase* ContextBase::getLBSProxy(const char* libName)
448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LBSProxyBase* proxy = NULL;
468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_LOGD("%s:%d]: getLBSProxy libname: %s\n", __func__, __LINE__, libName);
478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    void* lib = dlopen(libName, RTLD_NOW);
488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if ((void*)NULL != lib) {
508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        getLBSProxy_t* getter = (getLBSProxy_t*)dlsym(lib, "getLBSProxy");
518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        if (NULL != getter) {
528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            proxy = (*getter)();
538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        }
548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (NULL == proxy) {
568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        proxy = new LBSProxyBase();
578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_LOGD("%s:%d]: Exiting\n", __func__, __LINE__);
598c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    return proxy;
608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
628c2d3d5afc51d3f35150f748f263870367771b6fEd TamLocApiBase* ContextBase::createLocApi(LOC_API_ADAPTER_EVENT_MASK_T exMask)
638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LocApiBase* locApi = NULL;
658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    // first if can not be MPQ
678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (TARGET_MPQ != loc_get_target()) {
688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        if (NULL == (locApi = mLBSProxy->getLocApi(mMsgTask, exMask, this))) {
698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            void *handle = NULL;
708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            //try to see if LocApiV02 is present
718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            if((handle = dlopen("libloc_api_v02.so", RTLD_NOW)) != NULL) {
728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                LOC_LOGD("%s:%d]: libloc_api_v02.so is present", __func__, __LINE__);
738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                getLocApi_t* getter = (getLocApi_t*)dlsym(handle, "getLocApi");
748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                if(getter != NULL) {
758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                    LOC_LOGD("%s:%d]: getter is not NULL for LocApiV02", __func__, __LINE__);
768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                    locApi = (*getter)(mMsgTask, exMask, this);
778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                }
788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            }
798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            // only RPC is the option now
808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            else {
818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                LOC_LOGD("%s:%d]: libloc_api_v02.so is NOT present. Trying RPC",
828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                         __func__, __LINE__);
838c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                handle = dlopen("libloc_api-rpc-qc.so", RTLD_NOW);
848c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                if (NULL != handle) {
858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                    getLocApi_t* getter = (getLocApi_t*)dlsym(handle, "getLocApi");
868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                    if (NULL != getter) {
878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                        LOC_LOGD("%s:%d]: getter is not NULL in RPC", __func__, __LINE__);
888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                        locApi = (*getter)(mMsgTask, exMask, this);
898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                    }
908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                }
918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            }
928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        }
938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    // locApi could still be NULL at this time
968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    // we would then create a dummy one
978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (NULL == locApi) {
988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        locApi = new LocApiBase(mMsgTask, exMask, this);
998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
1008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    return locApi;
1028c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
1038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1048c2d3d5afc51d3f35150f748f263870367771b6fEd TamContextBase::ContextBase(const MsgTask* msgTask,
1058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                         LOC_API_ADAPTER_EVENT_MASK_T exMask,
1068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                         const char* libName) :
1078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    mLBSProxy(getLBSProxy(libName)),
1088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    mMsgTask(msgTask),
1098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    mLocApi(createLocApi(exMask)),
1108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    mLocApiProxy(mLocApi->getLocApiProxy())
1118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
1128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
1138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
115