• 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 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