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