[core] Add client defined network status
This API will let the client force a network status. If set to Offline, we won't make network requests. When set make to Online, it will trigger the pending requests and try to fetch tiles from the network.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
#ifndef MBGL_STORAGE_NETWORK_STATUS
|
||||
#define MBGL_STORAGE_NETWORK_STATUS
|
||||
|
||||
#include <atomic>
|
||||
#include <mutex>
|
||||
#include <set>
|
||||
|
||||
@@ -12,12 +13,21 @@ class AsyncTask;
|
||||
|
||||
class NetworkStatus {
|
||||
public:
|
||||
enum class Status : uint8_t {
|
||||
Online,
|
||||
Offline,
|
||||
};
|
||||
|
||||
Status Get();
|
||||
void Set(Status);
|
||||
|
||||
static void Reachable();
|
||||
|
||||
static void Subscribe(util::AsyncTask* async);
|
||||
static void Unsubscribe(util::AsyncTask* async);
|
||||
|
||||
private:
|
||||
static std::atomic<bool> online;
|
||||
static std::mutex mtx;
|
||||
static std::set<util::AsyncTask*> observers;
|
||||
};
|
||||
|
||||
@@ -9,9 +9,27 @@
|
||||
|
||||
namespace mbgl {
|
||||
|
||||
std::atomic<bool> NetworkStatus::online(true);
|
||||
std::mutex NetworkStatus::mtx;
|
||||
std::set<util::AsyncTask *> NetworkStatus::observers;
|
||||
|
||||
NetworkStatus::Status NetworkStatus::Get() {
|
||||
if (online) {
|
||||
return Status::Online;
|
||||
} else {
|
||||
return Status::Offline;
|
||||
}
|
||||
}
|
||||
|
||||
void NetworkStatus::Set(Status status) {
|
||||
if (status == Status::Online) {
|
||||
online = true;
|
||||
Reachable();
|
||||
} else {
|
||||
online = false;
|
||||
}
|
||||
}
|
||||
|
||||
void NetworkStatus::Subscribe(util::AsyncTask *async) {
|
||||
std::lock_guard<std::mutex> lock(NetworkStatus::mtx);
|
||||
observers.insert(async);
|
||||
@@ -23,6 +41,10 @@ void NetworkStatus::Unsubscribe(util::AsyncTask *async) {
|
||||
}
|
||||
|
||||
void NetworkStatus::Reachable() {
|
||||
if (!online) {
|
||||
return;
|
||||
}
|
||||
|
||||
std::lock_guard<std::mutex> lock(NetworkStatus::mtx);
|
||||
for (auto async : observers) {
|
||||
async->send();
|
||||
|
||||
Reference in New Issue
Block a user