diff options
author | Dante Russo <drusso@codeaurora.org> | 2020-11-05 12:10:54 -0800 |
---|---|---|
committer | Wei (GPS SD) Chen <weic@codeaurora.org> | 2020-12-14 10:06:40 -0800 |
commit | 79cbbb3d2d17f89d98ab8ca1b95648dd32a128b3 (patch) | |
tree | f4192a3d5f16eed37d3a32bfb36bbc48d1c3dab8 | |
parent | 3c25bbbb134079d2e1f6e1182d266812787f9ba7 (diff) |
Load OS Framework in Location API
Loading the OS Framework will allow for
WiFi AP information to be injected
Change-Id: Ie3227c0c5d75b6868b4db837dac47fef9d793b46
CRs-fixed: 2817934
-rw-r--r-- | location/LocationAPI.cpp | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/location/LocationAPI.cpp b/location/LocationAPI.cpp index 001327c..ffe2d6f 100644 --- a/location/LocationAPI.cpp +++ b/location/LocationAPI.cpp @@ -39,7 +39,8 @@ typedef const GnssInterface* (getGnssInterface)(); typedef const FlpInterface* (getFlpInterface)(); typedef const GeofenceInterface* (getGeofenceInterface)(); - +typedef void (createOSFramework)(); +typedef void (destroyOSFramework)(); typedef struct { // bit mask of the adpaters that we need to wait for the removeClientCompleteCallback @@ -69,6 +70,7 @@ static pthread_mutex_t gDataMutex = PTHREAD_MUTEX_INITIALIZER; static bool gGnssLoadFailed = false; static bool gFlpLoadFailed = false; static bool gGeofenceLoadFailed = false; +static uint32_t gOSFrameworkRefCount = 0; template <typename T1, typename T2> static const T1* loadLocationInterface(const char* library, const char* name) { @@ -81,6 +83,28 @@ static const T1* loadLocationInterface(const char* library, const char* name) { } } +static void createOSFrameworkInstance() { + void* libHandle = nullptr; + createOSFramework* getter = (createOSFramework*)dlGetSymFromLib(libHandle, + "liblocationservice_glue.so", "createOSFramework"); + if (getter != nullptr) { + (*getter)(); + } else { + LOC_LOGe("dlGetSymFromLib failed for liblocationservice_glue.so"); + } +} + +static void destroyOSFrameworkInstance() { + void* libHandle = nullptr; + destroyOSFramework* getter = (destroyOSFramework*)dlGetSymFromLib(libHandle, + "liblocationservice_glue.so", "destroyOSFramework"); + if (getter != nullptr) { + (*getter)(); + } else { + LOC_LOGe("dlGetSymFromLib failed for liblocationservice_glue.so"); + } +} + static bool needsGnssTrackingInfo(LocationCallbacks& locationCallbacks) { return (locationCallbacks.gnssLocationInfoCb != nullptr || @@ -171,6 +195,11 @@ LocationAPI::createInstance(LocationCallbacks& locationCallbacks) pthread_mutex_lock(&gDataMutex); + gOSFrameworkRefCount++; + if (1 == gOSFrameworkRefCount) { + createOSFrameworkInstance(); + } + if (isGnssClient(locationCallbacks)) { if (NULL == gData.gnssInterface && !gGnssLoadFailed) { gData.gnssInterface = @@ -295,6 +324,11 @@ LocationAPI::destroy(locationApiDestroyCompleteCallback destroyCompleteCb) __func__, __LINE__, this); } + if (1 == gOSFrameworkRefCount) { + destroyOSFrameworkInstance(); + } + gOSFrameworkRefCount--; + pthread_mutex_unlock(&gDataMutex); if (invokeDestroyCb == true) { (destroyCompleteCb) (); |