1 /*
2 * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "network_observer.h"
17 #include "net_conn_client.h"
18 #include "network_constant.h"
19
20 #include "netmanager_base_log.h"
21 #include "securec.h"
22
23 static constexpr const char *NETWORK_NONE = "none";
24
25 static constexpr const char *NETWORK_WIFI = "WiFi";
26
27 static std::mutex OBSERVER_MUTEX;
28
29 namespace OHOS::NetManagerStandard {
30 std::map<std::shared_ptr<EventManager>, sptr<NetworkObserver>> g_observerMap;
31 std::shared_mutex g_observerMapMtx;
32
MakeNetworkResponse(napi_env env,NetworkType * data)33 static napi_value MakeNetworkResponse(napi_env env, NetworkType *data)
34 {
35 auto deleter = [](NetworkType *t) { delete t; };
36 std::unique_ptr<NetworkType, decltype(deleter)> netType(data, deleter);
37
38 napi_value obj = NapiUtils::CreateObject(env);
39 if (netType->bearerTypes.find(BEARER_WIFI) != netType->bearerTypes.end()) {
40 NapiUtils::SetStringPropertyUtf8(env, obj, KEY_TYPE, NETWORK_WIFI);
41 NapiUtils::SetBooleanProperty(env, obj, KEY_METERED, false);
42 return obj;
43 }
44
45 if (netType->bearerTypes.find(BEARER_CELLULAR) != netType->bearerTypes.end()) {
46 std::string type = "";
47 int32_t ret = NetConnClient::GetInstance().GetSlotType(type);
48 if (ret != NETMANAGER_SUCCESS || type.empty()) {
49 type = "none";
50 }
51 NapiUtils::SetStringPropertyUtf8(env, obj, KEY_TYPE, type);
52 NapiUtils::SetBooleanProperty(env, obj, KEY_METERED, true);
53 return obj;
54 }
55
56 NapiUtils::SetStringPropertyUtf8(env, obj, KEY_TYPE, NETWORK_NONE);
57 NapiUtils::SetBooleanProperty(env, obj, KEY_METERED, false);
58 return obj;
59 }
60
NetAvailable(sptr<NetHandle> & netHandle)61 int32_t NetworkObserver::NetAvailable(sptr<NetHandle> &netHandle)
62 {
63 return 0;
64 }
65
NetCapabilitiesChange(sptr<NetHandle> & netHandle,const sptr<NetAllCapabilities> & netAllCap)66 int32_t NetworkObserver::NetCapabilitiesChange(sptr<NetHandle> &netHandle, const sptr<NetAllCapabilities> &netAllCap)
67 {
68 NETMANAGER_BASE_LOGI("NetworkObserver::NetCapabilitiesChange");
69
70 std::lock_guard<std::mutex> lock(OBSERVER_MUTEX);
71 if (!manager_) {
72 NETMANAGER_BASE_LOGI("no event manager");
73 return 0;
74 }
75
76 if (manager_->HasEventListener(EVENT_SUBSCRIBE)) {
77 auto netType = new NetworkType;
78 netType->bearerTypes = netAllCap->bearerTypes_;
79 manager_->EmitByUv(EVENT_SUBSCRIBE, netType, CallbackTemplate<MakeNetworkResponse>);
80 } else {
81 NETMANAGER_BASE_LOGI("NO EVENT_SUBSCRIBE");
82 }
83 return 0;
84 }
85
NetConnectionPropertiesChange(sptr<NetHandle> & netHandle,const sptr<NetLinkInfo> & info)86 int32_t NetworkObserver::NetConnectionPropertiesChange(sptr<NetHandle> &netHandle, const sptr<NetLinkInfo> &info)
87 {
88 return 0;
89 }
90
NetLost(sptr<NetHandle> & netHandle)91 int32_t NetworkObserver::NetLost(sptr<NetHandle> &netHandle)
92 {
93 return 0;
94 }
95
NetUnavailable()96 int32_t NetworkObserver::NetUnavailable()
97 {
98 NETMANAGER_BASE_LOGI("NetworkObserver::NetUnavailable");
99
100 std::lock_guard<std::mutex> lock(OBSERVER_MUTEX);
101 if (!manager_) {
102 NETMANAGER_BASE_LOGI("no event manager");
103 return 0;
104 }
105 if (manager_->HasEventListener(EVENT_SUBSCRIBE)) {
106 auto netType = new NetworkType;
107 manager_->EmitByUv(EVENT_SUBSCRIBE, netType, CallbackTemplate<MakeNetworkResponse>);
108 } else {
109 NETMANAGER_BASE_LOGI("NO EVENT_SUBSCRIBE");
110 }
111 return 0;
112 }
113
NetBlockStatusChange(sptr<NetHandle> & netHandle,bool blocked)114 int32_t NetworkObserver::NetBlockStatusChange(sptr<NetHandle> &netHandle, bool blocked)
115 {
116 return 0;
117 }
118
SetManager(std::shared_ptr<EventManager> & manager)119 void NetworkObserver::SetManager(std::shared_ptr<EventManager>& manager)
120 {
121 manager_ = manager;
122 }
123 } // namespace OHOS::NetManagerStandard
124