1 #include <mbgl/storage/network_status.hpp> 2 3 #include <mbgl/util/async_task.hpp> 4 5 // Example: Allocate a reachability object 6 // Reachability* reach = [Reachability reachabilityForInternetConnection]; 7 // reach.reachableBlock = ^(Reachability* reach) { NetworkStatus::Reachable(); }; 8 // [reach startNotifier]; 9 10 namespace mbgl { 11 12 std::atomic<bool> NetworkStatus::online(true); 13 std::mutex NetworkStatus::mtx; 14 std::unordered_set<util::AsyncTask *> NetworkStatus::observers; 15 Get()16NetworkStatus::Status NetworkStatus::Get() { 17 if (online) { 18 return Status::Online; 19 } else { 20 return Status::Offline; 21 } 22 } 23 Set(Status status)24void NetworkStatus::Set(Status status) { 25 if (status == Status::Offline) { 26 online = false; 27 } else if(!online) { 28 online = true; 29 Reachable(); 30 } 31 } 32 Subscribe(util::AsyncTask * async)33void NetworkStatus::Subscribe(util::AsyncTask *async) { 34 std::lock_guard<std::mutex> lock(NetworkStatus::mtx); 35 observers.insert(async); 36 } 37 Unsubscribe(util::AsyncTask * async)38void NetworkStatus::Unsubscribe(util::AsyncTask *async) { 39 std::lock_guard<std::mutex> lock(NetworkStatus::mtx); 40 observers.erase(async); 41 } 42 Reachable()43void NetworkStatus::Reachable() { 44 if (!online) { 45 return; 46 } 47 48 std::lock_guard<std::mutex> lock(NetworkStatus::mtx); 49 for (auto async : observers) { 50 async->send(); 51 } 52 } 53 54 } // namespace mbgl 55