1/* Copyright (c) 2017, The Linux Foundation. All rights reserved. 2 * 3 * Redistribution and use in source and binary forms, with or without 4 * modification, are permitted provided that the following conditions are 5 * met: 6 * * Redistributions of source code must retain the above copyright 7 * notice, this list of conditions and the following disclaimer. 8 * * Redistributions in binary form must reproduce the above 9 * copyright notice, this list of conditions and the following 10 * disclaimer in the documentation and/or other materials provided 11 * with the distribution. 12 * * Neither the name of The Linux Foundation, nor the names of its 13 * contributors may be used to endorse or promote products derived 14 * from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 */ 29#define LOG_TAG "DataItemsFactoryProxy" 30 31#include <dlfcn.h> 32#include <DataItemId.h> 33#include <IDataItemCore.h> 34#include <DataItemsFactoryProxy.h> 35#include <platform_lib_log_util.h> 36 37namespace loc_core 38{ 39void* DataItemsFactoryProxy::dataItemLibHandle = NULL; 40get_concrete_data_item_fn* DataItemsFactoryProxy::getConcreteDIFunc = NULL; 41 42IDataItemCore* DataItemsFactoryProxy::createNewDataItem(DataItemId id) 43{ 44 IDataItemCore *mydi = nullptr; 45 46 if (NULL != getConcreteDIFunc) { 47 mydi = (*getConcreteDIFunc)(id); 48 } 49 else { 50 // first call to this function, symbol not yet loaded 51 if (NULL == dataItemLibHandle) { 52 LOC_LOGD("Loaded library %s",DATA_ITEMS_LIB_NAME); 53 dataItemLibHandle = dlopen(DATA_ITEMS_LIB_NAME, RTLD_NOW); 54 if (NULL == dataItemLibHandle) { 55 // dlopen failed. 56 const char * err = dlerror(); 57 if (NULL == err) 58 { 59 err = "Unknown"; 60 } 61 LOC_LOGE("%s:%d]: failed to load library %s; error=%s", 62 __func__, __LINE__, DATA_ITEMS_LIB_NAME, err); 63 } 64 } 65 66 // load sym - if dlopen handle is obtained and symbol is not yet obtained 67 if (NULL != dataItemLibHandle) { 68 getConcreteDIFunc = (get_concrete_data_item_fn * ) 69 dlsym(dataItemLibHandle, DATA_ITEMS_GET_CONCRETE_DI); 70 if (NULL != getConcreteDIFunc) { 71 LOC_LOGD("Loaded function %s : %x",DATA_ITEMS_GET_CONCRETE_DI,getConcreteDIFunc); 72 mydi = (*getConcreteDIFunc)(id); 73 } 74 else { 75 // dlysm failed. 76 const char * err = dlerror(); 77 if (NULL == err) 78 { 79 err = "Unknown"; 80 } 81 LOC_LOGE("%s:%d]: failed to find symbol %s; error=%s", 82 __func__, __LINE__, DATA_ITEMS_GET_CONCRETE_DI, err); 83 } 84 } 85 } 86 return mydi; 87} 88 89void DataItemsFactoryProxy::closeDataItemLibraryHandle() 90{ 91 if (NULL != dataItemLibHandle) { 92 dlclose(dataItemLibHandle); 93 dataItemLibHandle = NULL; 94 } 95} 96 97} // namespace loc_core 98 99 100