summaryrefslogtreecommitdiff
path: root/gps/location/LocationAPI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gps/location/LocationAPI.cpp')
-rw-r--r--gps/location/LocationAPI.cpp645
1 files changed, 0 insertions, 645 deletions
diff --git a/gps/location/LocationAPI.cpp b/gps/location/LocationAPI.cpp
deleted file mode 100644
index 0111a9c..0000000
--- a/gps/location/LocationAPI.cpp
+++ /dev/null
@@ -1,645 +0,0 @@
-/* Copyright (c) 2017 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#define LOG_TAG "LocSvc_LocationAPI"
-
-#include <location_interface.h>
-#include <dlfcn.h>
-#include <loc_pla.h>
-#include <log_util.h>
-#include <pthread.h>
-#include <map>
-
-typedef void* (getLocationInterface)();
-typedef std::map<LocationAPI*, LocationCallbacks> LocationClientMap;
-typedef struct {
- LocationClientMap clientData;
- LocationControlAPI* controlAPI;
- LocationControlCallbacks controlCallbacks;
- GnssInterface* gnssInterface;
- GeofenceInterface* geofenceInterface;
- FlpInterface* flpInterface;
-} LocationAPIData;
-static LocationAPIData gData = {};
-static pthread_mutex_t gDataMutex = PTHREAD_MUTEX_INITIALIZER;
-static bool gGnssLoadFailed = false;
-static bool gFlpLoadFailed = false;
-static bool gGeofenceLoadFailed = false;
-
-static bool needsGnssTrackingInfo(LocationCallbacks& locationCallbacks)
-{
- return (locationCallbacks.gnssLocationInfoCb != nullptr ||
- locationCallbacks.gnssSvCb != nullptr ||
- locationCallbacks.gnssNmeaCb != nullptr ||
- locationCallbacks.gnssMeasurementsCb != nullptr);
-}
-
-static bool isGnssClient(LocationCallbacks& locationCallbacks)
-{
- return (locationCallbacks.gnssNiCb != nullptr ||
- locationCallbacks.trackingCb != nullptr ||
- locationCallbacks.gnssMeasurementsCb != nullptr);
-}
-
-static bool isFlpClient(LocationCallbacks& locationCallbacks)
-{
- return (locationCallbacks.trackingCb != nullptr ||
- locationCallbacks.batchingCb != nullptr);
-}
-
-static bool isGeofenceClient(LocationCallbacks& locationCallbacks)
-{
- return (locationCallbacks.geofenceBreachCb != nullptr ||
- locationCallbacks.geofenceStatusCb != nullptr);
-}
-
-static void* loadLocationInterface(const char* library, const char* name) {
- LOC_LOGD("%s]: loading %s::%s ...", __func__, library, name);
- if (NULL == library || NULL == name) {
- return NULL;
- }
- getLocationInterface* getter = NULL;
- const char *error = NULL;
- dlerror();
- void *handle = dlopen(library, RTLD_NOW);
- if (NULL == handle || (error = dlerror()) != NULL) {
- LOC_LOGW("dlopen for %s failed, error = %s", library, error);
- } else {
- getter = (getLocationInterface*)dlsym(handle, name);
- if ((error = dlerror()) != NULL) {
- LOC_LOGW("dlsym for %s::%s failed, error = %s", library, name, error);
- getter = NULL;
- }
- }
-
- if (NULL == getter) {
- return (void*)getter;
- } else {
- return (*getter)();
- }
-}
-
-LocationAPI*
-LocationAPI::createInstance(LocationCallbacks& locationCallbacks)
-{
- if (nullptr == locationCallbacks.capabilitiesCb ||
- nullptr == locationCallbacks.responseCb ||
- nullptr == locationCallbacks.collectiveResponseCb) {
- return NULL;
- }
-
- LocationAPI* newLocationAPI = new LocationAPI();
- bool requestedCapabilities = false;
-
- pthread_mutex_lock(&gDataMutex);
-
- if (isGnssClient(locationCallbacks)) {
- if (NULL == gData.gnssInterface && !gGnssLoadFailed) {
- gData.gnssInterface =
- (GnssInterface*)loadLocationInterface("libgnss.so", "getGnssInterface");
- if (NULL == gData.gnssInterface) {
- gGnssLoadFailed = true;
- LOC_LOGW("%s:%d]: No gnss interface available", __func__, __LINE__);
- } else {
- gData.gnssInterface->initialize();
- }
- }
- if (NULL != gData.gnssInterface) {
- gData.gnssInterface->addClient(newLocationAPI, locationCallbacks);
- if (!requestedCapabilities) {
- gData.gnssInterface->requestCapabilities(newLocationAPI);
- requestedCapabilities = true;
- }
- }
- }
-
- if (isFlpClient(locationCallbacks)) {
- if (NULL == gData.flpInterface && !gFlpLoadFailed) {
- gData.flpInterface =
- (FlpInterface*)loadLocationInterface("libflp.so", "getFlpInterface");
- if (NULL == gData.flpInterface) {
- gFlpLoadFailed = true;
- LOC_LOGW("%s:%d]: No flp interface available", __func__, __LINE__);
- } else {
- gData.flpInterface->initialize();
- }
- }
- if (NULL != gData.flpInterface) {
- gData.flpInterface->addClient(newLocationAPI, locationCallbacks);
- if (!requestedCapabilities) {
- gData.flpInterface->requestCapabilities(newLocationAPI);
- requestedCapabilities = true;
- }
- }
- }
-
- if (isGeofenceClient(locationCallbacks)) {
- if (NULL == gData.geofenceInterface && !gGeofenceLoadFailed) {
- gData.geofenceInterface =
- (GeofenceInterface*)loadLocationInterface("libgeofence.so", "getGeofenceInterface");
- if (NULL == gData.geofenceInterface) {
- gGeofenceLoadFailed = true;
- LOC_LOGW("%s:%d]: No geofence interface available", __func__, __LINE__);
- } else {
- gData.geofenceInterface->initialize();
- }
- }
- if (NULL != gData.geofenceInterface) {
- gData.geofenceInterface->addClient(newLocationAPI, locationCallbacks);
- if (!requestedCapabilities) {
- gData.geofenceInterface->requestCapabilities(newLocationAPI);
- requestedCapabilities = true;
- }
- }
- }
-
- gData.clientData[newLocationAPI] = locationCallbacks;
-
- pthread_mutex_unlock(&gDataMutex);
-
- return newLocationAPI;
-}
-
-void
-LocationAPI::destroy()
-{
- delete this;
-}
-
-LocationAPI::LocationAPI()
-{
- LOC_LOGD("LOCATION API CONSTRUCTOR");
-}
-
-LocationAPI::~LocationAPI()
-{
- LOC_LOGD("LOCATION API DESTRUCTOR");
- pthread_mutex_lock(&gDataMutex);
-
- auto it = gData.clientData.find(this);
- if (it != gData.clientData.end()) {
- if (isGnssClient(it->second) && NULL != gData.gnssInterface) {
- gData.gnssInterface->removeClient(it->first);
- }
- if (isFlpClient(it->second) && NULL != gData.flpInterface) {
- gData.flpInterface->removeClient(it->first);
- }
- if (isGeofenceClient(it->second) && NULL != gData.geofenceInterface) {
- gData.geofenceInterface->removeClient(it->first);
- }
- gData.clientData.erase(it);
- } else {
- LOC_LOGE("%s:%d]: Location API client %p not found in client data",
- __func__, __LINE__, this);
- }
-
- pthread_mutex_unlock(&gDataMutex);
-}
-
-void
-LocationAPI::updateCallbacks(LocationCallbacks& locationCallbacks)
-{
- if (nullptr == locationCallbacks.capabilitiesCb ||
- nullptr == locationCallbacks.responseCb ||
- nullptr == locationCallbacks.collectiveResponseCb) {
- return;
- }
-
- pthread_mutex_lock(&gDataMutex);
-
- if (isGnssClient(locationCallbacks)) {
- if (NULL == gData.gnssInterface && !gGnssLoadFailed) {
- gData.gnssInterface =
- (GnssInterface*)loadLocationInterface("libgnss.so", "getGnssInterface");
- if (NULL == gData.gnssInterface) {
- gGnssLoadFailed = true;
- LOC_LOGW("%s:%d]: No gnss interface available", __func__, __LINE__);
- } else {
- gData.gnssInterface->initialize();
- }
- }
- if (NULL != gData.gnssInterface) {
- // either adds new Client or updates existing Client
- gData.gnssInterface->addClient(this, locationCallbacks);
- }
- }
-
- if (isFlpClient(locationCallbacks)) {
- if (NULL == gData.flpInterface && !gFlpLoadFailed) {
- gData.flpInterface =
- (FlpInterface*)loadLocationInterface("libflp.so", "getFlpInterface");
- if (NULL == gData.flpInterface) {
- gFlpLoadFailed = true;
- LOC_LOGW("%s:%d]: No flp interface available", __func__, __LINE__);
- } else {
- gData.flpInterface->initialize();
- }
- }
- if (NULL != gData.flpInterface) {
- // either adds new Client or updates existing Client
- gData.flpInterface->addClient(this, locationCallbacks);
- }
- }
-
- if (isGeofenceClient(locationCallbacks)) {
- if (NULL == gData.geofenceInterface && !gGeofenceLoadFailed) {
- gData.geofenceInterface =
- (GeofenceInterface*)loadLocationInterface("libgeofence.so", "getGeofenceInterface");
- if (NULL == gData.geofenceInterface) {
- gGeofenceLoadFailed = true;
- LOC_LOGW("%s:%d]: No geofence interface available", __func__, __LINE__);
- } else {
- gData.geofenceInterface->initialize();
- }
- }
- if (NULL != gData.geofenceInterface) {
- // either adds new Client or updates existing Client
- gData.geofenceInterface->addClient(this, locationCallbacks);
- }
- }
-
- gData.clientData[this] = locationCallbacks;
-
- pthread_mutex_unlock(&gDataMutex);
-}
-
-uint32_t
-LocationAPI::startTracking(LocationOptions& locationOptions)
-{
- uint32_t id = 0;
- pthread_mutex_lock(&gDataMutex);
-
- auto it = gData.clientData.find(this);
- if (it != gData.clientData.end()) {
- if (gData.flpInterface != NULL && locationOptions.minDistance > 0) {
- id = gData.flpInterface->startTracking(this, locationOptions);
- } else if (gData.gnssInterface != NULL && needsGnssTrackingInfo(it->second)) {
- id = gData.gnssInterface->startTracking(this, locationOptions);
- } else if (gData.flpInterface != NULL) {
- id = gData.flpInterface->startTracking(this, locationOptions);
- } else if (gData.gnssInterface != NULL) {
- id = gData.gnssInterface->startTracking(this, locationOptions);
- } else {
- LOC_LOGE("%s:%d]: No gnss/flp interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
- } else {
- LOC_LOGE("%s:%d]: Location API client %p not found in client data",
- __func__, __LINE__, this);
- }
-
- pthread_mutex_unlock(&gDataMutex);
- return id;
-}
-
-void
-LocationAPI::stopTracking(uint32_t id)
-{
- pthread_mutex_lock(&gDataMutex);
-
- auto it = gData.clientData.find(this);
- if (it != gData.clientData.end()) {
- // we don't know if tracking was started on flp or gnss, so we call stop on both, where
- // stopTracking call to the incorrect interface will fail without response back to client
- if (gData.gnssInterface != NULL) {
- gData.gnssInterface->stopTracking(this, id);
- }
- if (gData.flpInterface != NULL) {
- gData.flpInterface->stopTracking(this, id);
- }
- if (gData.flpInterface == NULL && gData.gnssInterface == NULL) {
- LOC_LOGE("%s:%d]: No gnss/flp interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
- } else {
- LOC_LOGE("%s:%d]: Location API client %p not found in client data",
- __func__, __LINE__, this);
- }
-
- pthread_mutex_unlock(&gDataMutex);
-}
-
-void
-LocationAPI::updateTrackingOptions(uint32_t id, LocationOptions& locationOptions)
-{
- pthread_mutex_lock(&gDataMutex);
-
- auto it = gData.clientData.find(this);
- if (it != gData.clientData.end()) {
- // we don't know if tracking was started on flp or gnss, so we call update on both, where
- // updateTracking call to the incorrect interface will fail without response back to client
- if (gData.gnssInterface != NULL) {
- gData.gnssInterface->updateTrackingOptions(this, id, locationOptions);
- }
- if (gData.flpInterface != NULL) {
- gData.flpInterface->updateTrackingOptions(this, id, locationOptions);
- }
- if (gData.flpInterface == NULL && gData.gnssInterface == NULL) {
- LOC_LOGE("%s:%d]: No gnss/flp interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
- } else {
- LOC_LOGE("%s:%d]: Location API client %p not found in client data",
- __func__, __LINE__, this);
- }
-
- pthread_mutex_unlock(&gDataMutex);
-}
-
-uint32_t
-LocationAPI::startBatching(LocationOptions& locationOptions, BatchingOptions &batchingOptions)
-{
- uint32_t id = 0;
- pthread_mutex_lock(&gDataMutex);
-
- if (gData.flpInterface != NULL) {
- id = gData.flpInterface->startBatching(this, locationOptions, batchingOptions);
- } else {
- LOC_LOGE("%s:%d]: No flp interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
-
- pthread_mutex_unlock(&gDataMutex);
- return id;
-}
-
-void
-LocationAPI::stopBatching(uint32_t id)
-{
- pthread_mutex_lock(&gDataMutex);
-
- if (gData.flpInterface != NULL) {
- gData.flpInterface->stopBatching(this, id);
- } else {
- LOC_LOGE("%s:%d]: No flp interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
-
- pthread_mutex_unlock(&gDataMutex);
-}
-
-void
-LocationAPI::updateBatchingOptions(uint32_t id,
- LocationOptions& locationOptions, BatchingOptions& batchOptions)
-{
- pthread_mutex_lock(&gDataMutex);
-
- if (gData.flpInterface != NULL) {
- gData.flpInterface->updateBatchingOptions(this,
- id,
- locationOptions,
- batchOptions);
- } else {
- LOC_LOGE("%s:%d]: No flp interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
-
- pthread_mutex_unlock(&gDataMutex);
-}
-
-void
-LocationAPI::getBatchedLocations(uint32_t id, size_t count)
-{
- pthread_mutex_lock(&gDataMutex);
-
- if (gData.flpInterface != NULL) {
- gData.flpInterface->getBatchedLocations(this, id, count);
- } else {
- LOC_LOGE("%s:%d]: No flp interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
-
- pthread_mutex_unlock(&gDataMutex);
-}
-
-uint32_t*
-LocationAPI::addGeofences(size_t count, GeofenceOption* options, GeofenceInfo* info)
-{
- uint32_t* ids = NULL;
- pthread_mutex_lock(&gDataMutex);
-
- if (gData.geofenceInterface != NULL) {
- ids = gData.geofenceInterface->addGeofences(this, count, options, info);
- } else {
- LOC_LOGE("%s:%d]: No geofence interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
-
- pthread_mutex_unlock(&gDataMutex);
- return ids;
-}
-
-void
-LocationAPI::removeGeofences(size_t count, uint32_t* ids)
-{
- pthread_mutex_lock(&gDataMutex);
-
- if (gData.geofenceInterface != NULL) {
- gData.geofenceInterface->removeGeofences(this, count, ids);
- } else {
- LOC_LOGE("%s:%d]: No geofence interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
-
- pthread_mutex_unlock(&gDataMutex);
-}
-
-void
-LocationAPI::modifyGeofences(size_t count, uint32_t* ids, GeofenceOption* options)
-{
- pthread_mutex_lock(&gDataMutex);
-
- if (gData.geofenceInterface != NULL) {
- gData.geofenceInterface->modifyGeofences(this, count, ids, options);
- } else {
- LOC_LOGE("%s:%d]: No geofence interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
-
- pthread_mutex_unlock(&gDataMutex);
-}
-
-void
-LocationAPI::pauseGeofences(size_t count, uint32_t* ids)
-{
- pthread_mutex_lock(&gDataMutex);
-
- if (gData.geofenceInterface != NULL) {
- gData.geofenceInterface->pauseGeofences(this, count, ids);
- } else {
- LOC_LOGE("%s:%d]: No geofence interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
-
- pthread_mutex_unlock(&gDataMutex);
-}
-
-void
-LocationAPI::resumeGeofences(size_t count, uint32_t* ids)
-{
- pthread_mutex_lock(&gDataMutex);
-
- if (gData.geofenceInterface != NULL) {
- gData.geofenceInterface->resumeGeofences(this, count, ids);
- } else {
- LOC_LOGE("%s:%d]: No geofence interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
-
- pthread_mutex_unlock(&gDataMutex);
-}
-
-void
-LocationAPI::gnssNiResponse(uint32_t id, GnssNiResponse response)
-{
- pthread_mutex_lock(&gDataMutex);
-
- if (gData.gnssInterface != NULL) {
- gData.gnssInterface->gnssNiResponse(this, id, response);
- } else {
- LOC_LOGE("%s:%d]: No gnss interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
-
- pthread_mutex_unlock(&gDataMutex);
-}
-
-LocationControlAPI*
-LocationControlAPI::createInstance(LocationControlCallbacks& locationControlCallbacks)
-{
- LocationControlAPI* controlAPI = NULL;
- pthread_mutex_lock(&gDataMutex);
-
- if (nullptr != locationControlCallbacks.responseCb && NULL == gData.controlAPI) {
- if (NULL == gData.gnssInterface && !gGnssLoadFailed) {
- gData.gnssInterface =
- (GnssInterface*)loadLocationInterface("libgnss.so", "getGnssInterface");
- if (NULL == gData.gnssInterface) {
- gGnssLoadFailed = true;
- LOC_LOGW("%s:%d]: No gnss interface available", __func__, __LINE__);
- } else {
- gData.gnssInterface->initialize();
- }
- }
- if (NULL != gData.gnssInterface) {
- gData.controlAPI = new LocationControlAPI();
- gData.controlCallbacks = locationControlCallbacks;
- gData.gnssInterface->setControlCallbacks(locationControlCallbacks);
- controlAPI = gData.controlAPI;
- }
- }
-
- pthread_mutex_unlock(&gDataMutex);
- return controlAPI;
-}
-
-void
-LocationControlAPI::destroy()
-{
- delete this;
-}
-
-LocationControlAPI::LocationControlAPI()
-{
- LOC_LOGD("LOCATION CONTROL API CONSTRUCTOR");
-}
-
-LocationControlAPI::~LocationControlAPI()
-{
- LOC_LOGD("LOCATION CONTROL API DESTRUCTOR");
- pthread_mutex_lock(&gDataMutex);
-
- gData.controlAPI = NULL;
-
- pthread_mutex_unlock(&gDataMutex);
-}
-
-uint32_t
-LocationControlAPI::enable(LocationTechnologyType techType)
-{
- uint32_t id = 0;
- pthread_mutex_lock(&gDataMutex);
-
- if (gData.gnssInterface != NULL) {
- id = gData.gnssInterface->enable(techType);
- } else {
- LOC_LOGE("%s:%d]: No gnss interface available for Location Control API client %p ",
- __func__, __LINE__, this);
- }
-
- pthread_mutex_unlock(&gDataMutex);
- return id;
-}
-
-void
-LocationControlAPI::disable(uint32_t id)
-{
- pthread_mutex_lock(&gDataMutex);
-
- if (gData.gnssInterface != NULL) {
- gData.gnssInterface->disable(id);
- } else {
- LOC_LOGE("%s:%d]: No gnss interface available for Location Control API client %p ",
- __func__, __LINE__, this);
- }
-
- pthread_mutex_unlock(&gDataMutex);
-}
-
-uint32_t*
-LocationControlAPI::gnssUpdateConfig(GnssConfig config)
-{
- uint32_t* ids = NULL;
- pthread_mutex_lock(&gDataMutex);
-
- if (gData.gnssInterface != NULL) {
- ids = gData.gnssInterface->gnssUpdateConfig(config);
- } else {
- LOC_LOGE("%s:%d]: No gnss interface available for Location Control API client %p ",
- __func__, __LINE__, this);
- }
-
- pthread_mutex_unlock(&gDataMutex);
- return ids;
-}
-
-uint32_t
-LocationControlAPI::gnssDeleteAidingData(GnssAidingData& data)
-{
- uint32_t id = 0;
- pthread_mutex_lock(&gDataMutex);
-
- if (gData.gnssInterface != NULL) {
- id = gData.gnssInterface->gnssDeleteAidingData(data);
- } else {
- LOC_LOGE("%s:%d]: No gnss interface available for Location Control API client %p ",
- __func__, __LINE__, this);
- }
-
- pthread_mutex_unlock(&gDataMutex);
- return id;
-}