summaryrefslogtreecommitdiff
path: root/location/LocationAPIClientBase.h
diff options
context:
space:
mode:
authorBaili Feng <bailif@codeaurora.org>2017-07-20 17:02:26 +0800
committerBaili Feng <bailif@codeaurora.org>2017-07-24 21:42:24 +0800
commit2df685d3ec307cd24900b856529fe6a7fe9c7818 (patch)
tree842e2243779a0e209a02f1649bedf7b7038f05fa /location/LocationAPIClientBase.h
parent1bd0de5d87278a63b0b7a9b956e02ddfa1eeea47 (diff)
downloadgps-2df685d3ec307cd24900b856529fe6a7fe9c7818.tar.gz
Support multiple sessions
Start more than one sessions by calling locAPIStartSession multiple times Change-Id: I1625faaab0f69fcb2700b6dbd695f59061c6a88d CRs-fixed: 2079631
Diffstat (limited to 'location/LocationAPIClientBase.h')
-rw-r--r--location/LocationAPIClientBase.h82
1 files changed, 56 insertions, 26 deletions
diff --git a/location/LocationAPIClientBase.h b/location/LocationAPIClientBase.h
index 354e51f..19d585a 100644
--- a/location/LocationAPIClientBase.h
+++ b/location/LocationAPIClientBase.h
@@ -45,7 +45,7 @@ enum SESSION_MODE {
enum REQUEST_TYPE {
REQUEST_TRACKING = 0,
- REQUEST_BATCHING,
+ REQUEST_SESSION,
REQUEST_GEOFENCE,
REQUEST_NIRESPONSE,
REQUEST_MAX,
@@ -64,7 +64,7 @@ class LocationAPIRequest {
public:
LocationAPIRequest() {}
virtual ~LocationAPIRequest() {}
- virtual void onResponse(LocationError /*error*/) {}
+ virtual void onResponse(LocationError /*error*/, uint32_t /*id*/) {}
virtual void onCollectiveResponse(
size_t /*count*/, LocationError* /*errors*/, uint32_t* /*ids*/) {}
};
@@ -76,6 +76,7 @@ public:
virtual ~RequestQueue() {
reset(0);
}
+ void inline setSession(uint32_t session) { mSession = session; }
void reset(uint32_t session) {
LocationAPIRequest* request = nullptr;
while (!mQueue.empty()) {
@@ -130,7 +131,7 @@ public:
class GnssDeleteAidingDataRequest : public LocationAPIRequest {
public:
GnssDeleteAidingDataRequest(LocationAPIControlClient& API) : mAPI(API) {}
- inline void onResponse(LocationError error) {
+ inline void onResponse(LocationError error, uint32_t /*id*/) {
mAPI.onGnssDeleteAidingDataCb(error);
}
LocationAPIControlClient& mAPI;
@@ -139,7 +140,7 @@ public:
class EnableRequest : public LocationAPIRequest {
public:
EnableRequest(LocationAPIControlClient& API) : mAPI(API) {}
- inline void onResponse(LocationError error) {
+ inline void onResponse(LocationError error, uint32_t /*id*/) {
mAPI.onEnableCb(error);
}
LocationAPIControlClient& mAPI;
@@ -148,7 +149,7 @@ public:
class DisableRequest : public LocationAPIRequest {
public:
DisableRequest(LocationAPIControlClient& API) : mAPI(API) {}
- inline void onResponse(LocationError error) {
+ inline void onResponse(LocationError error, uint32_t /*id*/) {
mAPI.onDisableCb(error);
}
LocationAPIControlClient& mAPI;
@@ -179,6 +180,7 @@ public:
LocationAPIClientBase& operator=(const LocationAPIClientBase&) = delete;
void locAPISetCallbacks(LocationCallbacks& locationCallbacks);
+ void removeSession(uint32_t session);
LocationAPIRequest* getRequestBySession(uint32_t session);
// LocationAPI
@@ -257,6 +259,7 @@ private:
uint32_t sessionMode;
} SessionEntity;
+ template<typename T>
class BiDict {
public:
BiDict() {
@@ -271,24 +274,30 @@ private:
pthread_mutex_unlock(&mBiDictMutex);
return ret;
}
- void set(uint32_t id, uint32_t session, uint32_t type) {
+ bool hasSession(uint32_t session) {
+ pthread_mutex_lock(&mBiDictMutex);
+ bool ret = (mBackwardMap.find(session) != mBackwardMap.end());
+ pthread_mutex_unlock(&mBiDictMutex);
+ return ret;
+ }
+ void set(uint32_t id, uint32_t session, T& ext) {
pthread_mutex_lock(&mBiDictMutex);
mForwardMap[id] = session;
mBackwardMap[session] = id;
- mTypeMap[session] = type;
+ mExtMap[session] = ext;
pthread_mutex_unlock(&mBiDictMutex);
}
void clear() {
pthread_mutex_lock(&mBiDictMutex);
mForwardMap.clear();
mBackwardMap.clear();
- mTypeMap.clear();
+ mExtMap.clear();
pthread_mutex_unlock(&mBiDictMutex);
}
void rmById(uint32_t id) {
pthread_mutex_lock(&mBiDictMutex);
mBackwardMap.erase(mForwardMap[id]);
- mTypeMap.erase(mForwardMap[id]);
+ mExtMap.erase(mForwardMap[id]);
mForwardMap.erase(id);
pthread_mutex_unlock(&mBiDictMutex);
}
@@ -296,7 +305,7 @@ private:
pthread_mutex_lock(&mBiDictMutex);
mForwardMap.erase(mBackwardMap[session]);
mBackwardMap.erase(session);
- mTypeMap.erase(session);
+ mExtMap.erase(session);
pthread_mutex_unlock(&mBiDictMutex);
}
uint32_t getId(uint32_t session) {
@@ -319,11 +328,26 @@ private:
pthread_mutex_unlock(&mBiDictMutex);
return ret;
}
- uint32_t getType(uint32_t session) {
+ T getExtById(uint32_t id) {
pthread_mutex_lock(&mBiDictMutex);
- uint32_t ret = 0;
- auto it = mTypeMap.find(session);
- if (it != mTypeMap.end()) {
+ T ret;
+ memset(&ret, 0, sizeof(T));
+ uint32_t session = mForwardMap[id];
+ if (session > 0) {
+ auto it = mExtMap.find(session);
+ if (it != mExtMap.end()) {
+ ret = it->second;
+ }
+ }
+ pthread_mutex_unlock(&mBiDictMutex);
+ return ret;
+ }
+ T getExtBySession(uint32_t session) {
+ pthread_mutex_lock(&mBiDictMutex);
+ T ret;
+ memset(&ret, 0, sizeof(T));
+ auto it = mExtMap.find(session);
+ if (it != mExtMap.end()) {
ret = it->second;
}
pthread_mutex_unlock(&mBiDictMutex);
@@ -344,14 +368,14 @@ private:
std::map<uint32_t, uint32_t> mForwardMap;
// mBackwardMap mapping session->id
std::map<uint32_t, uint32_t> mBackwardMap;
- // mTypeMap mapping session->type
- std::map<uint32_t, uint32_t> mTypeMap;
+ // mExtMap mapping session->ext
+ std::map<uint32_t, T> mExtMap;
};
class StartTrackingRequest : public LocationAPIRequest {
public:
StartTrackingRequest(LocationAPIClientBase& API) : mAPI(API) {}
- inline void onResponse(LocationError error) {
+ inline void onResponse(LocationError error, uint32_t /*id*/) {
mAPI.onStartTrackingCb(error);
}
LocationAPIClientBase& mAPI;
@@ -360,8 +384,11 @@ private:
class StopTrackingRequest : public LocationAPIRequest {
public:
StopTrackingRequest(LocationAPIClientBase& API) : mAPI(API) {}
- inline void onResponse(LocationError error) {
+ inline void onResponse(LocationError error, uint32_t id) {
mAPI.onStopTrackingCb(error);
+ if (error == LOCATION_ERROR_SUCCESS) {
+ mAPI.removeSession(id);
+ }
}
LocationAPIClientBase& mAPI;
};
@@ -369,7 +396,7 @@ private:
class UpdateTrackingOptionsRequest : public LocationAPIRequest {
public:
UpdateTrackingOptionsRequest(LocationAPIClientBase& API) : mAPI(API) {}
- inline void onResponse(LocationError error) {
+ inline void onResponse(LocationError error, uint32_t /*id*/) {
mAPI.onUpdateTrackingOptionsCb(error);
}
LocationAPIClientBase& mAPI;
@@ -378,7 +405,7 @@ private:
class StartBatchingRequest : public LocationAPIRequest {
public:
StartBatchingRequest(LocationAPIClientBase& API) : mAPI(API) {}
- inline void onResponse(LocationError error) {
+ inline void onResponse(LocationError error, uint32_t /*id*/) {
mAPI.onStartBatchingCb(error);
}
LocationAPIClientBase& mAPI;
@@ -387,8 +414,11 @@ private:
class StopBatchingRequest : public LocationAPIRequest {
public:
StopBatchingRequest(LocationAPIClientBase& API) : mAPI(API) {}
- inline void onResponse(LocationError error) {
+ inline void onResponse(LocationError error, uint32_t id) {
mAPI.onStopBatchingCb(error);
+ if (error == LOCATION_ERROR_SUCCESS) {
+ mAPI.removeSession(id);
+ }
}
LocationAPIClientBase& mAPI;
};
@@ -396,7 +426,7 @@ private:
class UpdateBatchingOptionsRequest : public LocationAPIRequest {
public:
UpdateBatchingOptionsRequest(LocationAPIClientBase& API) : mAPI(API) {}
- inline void onResponse(LocationError error) {
+ inline void onResponse(LocationError error, uint32_t /*id*/) {
mAPI.onUpdateBatchingOptionsCb(error);
}
LocationAPIClientBase& mAPI;
@@ -405,7 +435,7 @@ private:
class GetBatchedLocationsRequest : public LocationAPIRequest {
public:
GetBatchedLocationsRequest(LocationAPIClientBase& API) : mAPI(API) {}
- inline void onResponse(LocationError error) {
+ inline void onResponse(LocationError error, uint32_t /*id*/) {
mAPI.onGetBatchedLocationsCb(error);
}
LocationAPIClientBase& mAPI;
@@ -485,7 +515,7 @@ private:
class GnssNiResponseRequest : public LocationAPIRequest {
public:
GnssNiResponseRequest(LocationAPIClientBase& API) : mAPI(API) {}
- inline void onResponse(LocationError error) {
+ inline void onResponse(LocationError error, uint32_t /*id*/) {
mAPI.onGnssNiResponseCb(error);
}
LocationAPIClientBase& mAPI;
@@ -499,8 +529,8 @@ private:
LocationAPI* mLocationAPI;
RequestQueue mRequestQueues[REQUEST_MAX];
- BiDict mGeofenceBiDict;
- std::map<uint32_t, SessionEntity> mSessionMap;
+ BiDict<GeofenceBreachTypeMask> mGeofenceBiDict;
+ BiDict<SessionEntity> mSessionBiDict;
int32_t mBatchSize;
};