• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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