summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mbgl/storage/network_status.hpp10
-rw-r--r--src/mbgl/storage/network_status.cpp22
2 files changed, 32 insertions, 0 deletions
diff --git a/include/mbgl/storage/network_status.hpp b/include/mbgl/storage/network_status.hpp
index 2a0ab78edd..4202793661 100644
--- a/include/mbgl/storage/network_status.hpp
+++ b/include/mbgl/storage/network_status.hpp
@@ -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;
};
diff --git a/src/mbgl/storage/network_status.cpp b/src/mbgl/storage/network_status.cpp
index 796cc5d27f..1ef5619bd6 100644
--- a/src/mbgl/storage/network_status.cpp
+++ b/src/mbgl/storage/network_status.cpp
@@ -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();