1 /*
2 * Copyright (c) 2022-2024 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 "net_conn_callback_observer.h"
17
18 #include "connection_exec.h"
19 #include "constant.h"
20 #include "netconnection.h"
21 #include "netmanager_base_log.h"
22
23 namespace OHOS::NetManagerStandard {
NetAvailable(sptr<NetHandle> & netHandle)24 int32_t NetConnCallbackObserver::NetAvailable(sptr<NetHandle> &netHandle)
25 {
26 if (netHandle == nullptr) {
27 return 0;
28 }
29 std::shared_lock<std::shared_mutex> lock(g_netConnectionsMutex);
30 auto iter = NET_CONNECTIONS.find(this);
31 if (iter == NET_CONNECTIONS.end()) {
32 NETMANAGER_BASE_LOGI("can not find netConnection key");
33 return 0;
34 }
35 auto netConnection = *iter;
36 lock.unlock();
37 if (netConnection.second == nullptr) {
38 NETMANAGER_BASE_LOGI("can not find netConnection handle");
39 return 0;
40 }
41 auto manager = netConnection.second->GetEventManager();
42 if (manager == nullptr) {
43 return 0;
44 }
45 if (!manager->HasEventListener(EVENT_NET_AVAILABLE)) {
46 NETMANAGER_BASE_LOGD("no %{public}s listener", EVENT_NET_AVAILABLE);
47 return 0;
48 }
49
50 auto network = *netHandle;
51 auto handler = [network, manager](napi_env env) {
52 auto obj = CreateNetAvailableParam(env, const_cast<NetHandle &>(network));
53 std::pair<napi_value, napi_value> arg = {NapiUtils::GetUndefined(env), obj};
54 manager->Emit(EVENT_NET_AVAILABLE, arg);
55 };
56 manager->EmitByUvWithModuleId(EVENT_NET_AVAILABLE, handler, netConnection.second->moduleId_);
57 return 0;
58 }
59
NetCapabilitiesChange(sptr<NetHandle> & netHandle,const sptr<NetAllCapabilities> & netAllCap)60 int32_t NetConnCallbackObserver::NetCapabilitiesChange(sptr<NetHandle> &netHandle,
61 const sptr<NetAllCapabilities> &netAllCap)
62 {
63 if (netHandle == nullptr || netAllCap == nullptr) {
64 return 0;
65 }
66 std::shared_lock<std::shared_mutex> lock(g_netConnectionsMutex);
67 auto iter = NET_CONNECTIONS.find(this);
68 if (iter == NET_CONNECTIONS.end()) {
69 NETMANAGER_BASE_LOGI("can not find netConnection key");
70 return 0;
71 }
72 auto netConnection = *iter;
73 lock.unlock();
74 if (netConnection.second == nullptr) {
75 NETMANAGER_BASE_LOGI("can not find netConnection handle");
76 return 0;
77 }
78 auto manager = netConnection.second->GetEventManager();
79 if (manager == nullptr) {
80 return 0;
81 }
82 if (!manager->HasEventListener(EVENT_NET_CAPABILITIES_CHANGE)) {
83 NETMANAGER_BASE_LOGD("no %{public}s listener", EVENT_NET_CAPABILITIES_CHANGE);
84 return 0;
85 }
86 auto network = *netHandle;
87 auto caps = *netAllCap;
88 auto handler = [network, caps, manager](napi_env env) {
89 auto obj = CreateNetCapabilitiesChangeParam(env, const_cast<NetHandle &>(network),
90 const_cast<NetAllCapabilities &>(caps));
91 std::pair<napi_value, napi_value> arg = {NapiUtils::GetUndefined(env), obj};
92 manager->Emit(EVENT_NET_CAPABILITIES_CHANGE, arg);
93 };
94 manager->EmitByUvWithModuleId(EVENT_NET_CAPABILITIES_CHANGE, handler, netConnection.second->moduleId_);
95 return 0;
96 }
97
NetConnectionPropertiesChange(sptr<NetHandle> & netHandle,const sptr<NetLinkInfo> & info)98 int32_t NetConnCallbackObserver::NetConnectionPropertiesChange(sptr<NetHandle> &netHandle,
99 const sptr<NetLinkInfo> &info)
100 {
101 if (netHandle == nullptr || info == nullptr) {
102 return 0;
103 }
104 std::shared_lock<std::shared_mutex> lock(g_netConnectionsMutex);
105 auto iter = NET_CONNECTIONS.find(this);
106 if (iter == NET_CONNECTIONS.end()) {
107 NETMANAGER_BASE_LOGI("can not find netConnection key");
108 return 0;
109 }
110 auto netConnection = *iter;
111 lock.unlock();
112 if (netConnection.second == nullptr) {
113 NETMANAGER_BASE_LOGI("can not find netConnection handle");
114 return 0;
115 }
116 auto manager = netConnection.second->GetEventManager();
117 if (manager == nullptr) {
118 return 0;
119 }
120 if (!manager->HasEventListener(EVENT_NET_CONNECTION_PROPERTIES_CHANGE)) {
121 NETMANAGER_BASE_LOGD("no %{public}s listener", EVENT_NET_CONNECTION_PROPERTIES_CHANGE);
122 return 0;
123 }
124 auto network = *netHandle;
125 auto linkInfo = *info;
126 auto handler = [network, linkInfo, manager](napi_env env) {
127 auto obj = CreateNetConnectionPropertiesChangeParam(env, const_cast<NetHandle &>(network),
128 const_cast<NetLinkInfo &>(linkInfo));
129 std::pair<napi_value, napi_value> arg = {NapiUtils::GetUndefined(env), obj};
130 manager->Emit(EVENT_NET_CONNECTION_PROPERTIES_CHANGE, arg);
131 };
132 manager->EmitByUvWithModuleId(EVENT_NET_CONNECTION_PROPERTIES_CHANGE, handler, netConnection.second->moduleId_);
133 return 0;
134 }
135
NetLost(sptr<NetHandle> & netHandle)136 int32_t NetConnCallbackObserver::NetLost(sptr<NetHandle> &netHandle)
137 {
138 if (netHandle == nullptr) {
139 return 0;
140 }
141 std::shared_lock<std::shared_mutex> lock(g_netConnectionsMutex);
142 auto iter = NET_CONNECTIONS.find(this);
143 if (iter == NET_CONNECTIONS.end()) {
144 NETMANAGER_BASE_LOGI("can not find netConnection key");
145 return 0;
146 }
147 auto netConnection = *iter;
148 lock.unlock();
149 if (netConnection.second == nullptr) {
150 NETMANAGER_BASE_LOGI("can not find netConnection handle");
151 return 0;
152 }
153 auto manager = netConnection.second->GetEventManager();
154 if (manager == nullptr) {
155 return 0;
156 }
157 if (!manager->HasEventListener(EVENT_NET_LOST)) {
158 NETMANAGER_BASE_LOGI("no event listener find %{public}s", EVENT_NET_LOST);
159 return 0;
160 }
161 auto network = *netHandle;
162 auto handler = [network, manager](napi_env env) {
163 auto obj = CreateNetLostParam(env, const_cast<NetHandle &>(network));
164 std::pair<napi_value, napi_value> arg = {NapiUtils::GetUndefined(env), obj};
165 manager->Emit(EVENT_NET_LOST, arg);
166 };
167 manager->EmitByUvWithModuleId(EVENT_NET_LOST, handler, netConnection.second->moduleId_);
168 return 0;
169 }
170
NetUnavailable()171 int32_t NetConnCallbackObserver::NetUnavailable()
172 {
173 std::shared_lock<std::shared_mutex> lock(g_netConnectionsMutex);
174 auto iter = NET_CONNECTIONS.find(this);
175 if (iter == NET_CONNECTIONS.end()) {
176 NETMANAGER_BASE_LOGI("can not find netConnection key");
177 return 0;
178 }
179 auto netConnection = *iter;
180 lock.unlock();
181 if (netConnection.second == nullptr) {
182 NETMANAGER_BASE_LOGI("can not find netConnection handle");
183 return 0;
184 }
185 auto manager = netConnection.second->GetEventManager();
186 if (manager == nullptr) {
187 return 0;
188 }
189 if (!manager->HasEventListener(EVENT_NET_UNAVAILABLE)) {
190 NETMANAGER_BASE_LOGI("no event listener find %{public}s", EVENT_NET_UNAVAILABLE);
191 return 0;
192 }
193 auto handler = [manager](napi_env env) {
194 auto obj = CreateNetUnavailableParam(env);
195 std::pair<napi_value, napi_value> arg = {NapiUtils::GetUndefined(env), obj};
196 manager->Emit(EVENT_NET_UNAVAILABLE, arg);
197 };
198 manager->EmitByUvWithModuleId(EVENT_NET_UNAVAILABLE, handler, netConnection.second->moduleId_);
199 return 0;
200 }
201
NetBlockStatusChange(sptr<NetHandle> & netHandle,bool blocked)202 int32_t NetConnCallbackObserver::NetBlockStatusChange(sptr<NetHandle> &netHandle, bool blocked)
203 {
204 if (netHandle == nullptr) {
205 return 0;
206 }
207 std::shared_lock<std::shared_mutex> lock(g_netConnectionsMutex);
208 auto iter = NET_CONNECTIONS.find(this);
209 if (iter == NET_CONNECTIONS.end()) {
210 NETMANAGER_BASE_LOGI("can not find netConnection key");
211 return 0;
212 }
213 auto netConnection = *iter;
214 lock.unlock();
215 if (netConnection.second == nullptr) {
216 NETMANAGER_BASE_LOGI("can not find netConnection handle");
217 return 0;
218 }
219 auto manager = netConnection.second->GetEventManager();
220 if (manager == nullptr) {
221 return 0;
222 }
223 if (!manager->HasEventListener(EVENT_NET_BLOCK_STATUS_CHANGE)) {
224 NETMANAGER_BASE_LOGI("no event listener find %{public}s", EVENT_NET_BLOCK_STATUS_CHANGE);
225 return 0;
226 }
227 auto network = *netHandle;
228 auto handler = [network, blocked, manager](napi_env env) {
229 auto obj = CreateNetBlockStatusChangeParam(env, const_cast<NetHandle &>(network), blocked);
230 std::pair<napi_value, napi_value> arg = {NapiUtils::GetUndefined(env), obj};
231 manager->Emit(EVENT_NET_BLOCK_STATUS_CHANGE, arg);
232 };
233 manager->EmitByUvWithModuleId(EVENT_NET_BLOCK_STATUS_CHANGE, handler, netConnection.second->moduleId_);
234 return 0;
235 }
236
CreateNetHandle(napi_env env,NetHandle & handle)237 napi_value NetConnCallbackObserver::CreateNetHandle(napi_env env, NetHandle &handle)
238 {
239 napi_value netHandle = ConnectionExec::CreateNetHandle(env, &handle);
240 return netHandle;
241 }
242
CreateNetCapabilities(napi_env env,NetAllCapabilities & capabilities)243 napi_value NetConnCallbackObserver::CreateNetCapabilities(napi_env env, NetAllCapabilities &capabilities)
244 {
245 napi_value netCapabilities = ConnectionExec::CreateNetCapabilities(env, &capabilities);
246 return netCapabilities;
247 }
248
CreateConnectionProperties(napi_env env,NetLinkInfo & linkInfo)249 napi_value NetConnCallbackObserver::CreateConnectionProperties(napi_env env, NetLinkInfo &linkInfo)
250 {
251 napi_value connectionProperties = ConnectionExec::CreateConnectionProperties(env, &linkInfo);
252 return connectionProperties;
253 }
254
CreateNetAvailableParam(napi_env env,NetHandle & netHandle)255 napi_value NetConnCallbackObserver::CreateNetAvailableParam(napi_env env, NetHandle &netHandle)
256 {
257 return CreateNetHandle(env, netHandle);
258 }
259
CreateNetCapabilitiesChangeParam(napi_env env,NetHandle & handle,NetAllCapabilities & caps)260 napi_value NetConnCallbackObserver::CreateNetCapabilitiesChangeParam(napi_env env, NetHandle &handle,
261 NetAllCapabilities &caps)
262 {
263 napi_value netHandle = CreateNetHandle(env, handle);
264 napi_value capabilities = CreateNetCapabilities(env, caps);
265 napi_value obj = NapiUtils::CreateObject(env);
266 NapiUtils::SetNamedProperty(env, obj, KEY_NET_HANDLE, netHandle);
267 NapiUtils::SetNamedProperty(env, obj, KEY_NET_CAP, capabilities);
268 return obj;
269 }
270
CreateNetConnectionPropertiesChangeParam(napi_env env,NetHandle & handle,NetLinkInfo & linkInfo)271 napi_value NetConnCallbackObserver::CreateNetConnectionPropertiesChangeParam(napi_env env, NetHandle &handle,
272 NetLinkInfo &linkInfo)
273 {
274 napi_value netHandle = CreateNetHandle(env, handle);
275 napi_value properties = CreateConnectionProperties(env, linkInfo);
276 napi_value obj = NapiUtils::CreateObject(env);
277 NapiUtils::SetNamedProperty(env, obj, KEY_NET_HANDLE, netHandle);
278 NapiUtils::SetNamedProperty(env, obj, KEY_CONNECTION_PROPERTIES, properties);
279 return obj;
280 }
281
CreateNetLostParam(napi_env env,NetHandle & netHandle)282 napi_value NetConnCallbackObserver::CreateNetLostParam(napi_env env, NetHandle &netHandle)
283 {
284 return CreateNetHandle(env, netHandle);
285 }
286
CreateNetUnavailableParam(napi_env env)287 napi_value NetConnCallbackObserver::CreateNetUnavailableParam(napi_env env)
288 {
289 return NapiUtils::GetUndefined(env);
290 }
291
CreateNetBlockStatusChangeParam(napi_env env,NetHandle & handle,bool blocked)292 napi_value NetConnCallbackObserver::CreateNetBlockStatusChangeParam(napi_env env, NetHandle &handle, bool blocked)
293 {
294 napi_value netHandle = CreateNetHandle(env, handle);
295 napi_value obj = NapiUtils::CreateObject(env);
296 NapiUtils::SetNamedProperty(env, obj, KEY_NET_HANDLE, netHandle);
297 NapiUtils::SetBooleanProperty(env, obj, KEY_BLOCKED, blocked);
298 return obj;
299 }
300 } // namespace OHOS::NetManagerStandard
301