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()16 NetworkStatus::Status NetworkStatus::Get() {
17     if (online) {
18         return Status::Online;
19     } else {
20         return Status::Offline;
21     }
22 }
23 
Set(Status status)24 void 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)33 void NetworkStatus::Subscribe(util::AsyncTask *async) {
34     std::lock_guard<std::mutex> lock(NetworkStatus::mtx);
35     observers.insert(async);
36 }
37 
Unsubscribe(util::AsyncTask * async)38 void NetworkStatus::Unsubscribe(util::AsyncTask *async) {
39     std::lock_guard<std::mutex> lock(NetworkStatus::mtx);
40     observers.erase(async);
41 }
42 
Reachable()43 void 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