• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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<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(EventManager * manager)119 void NetworkObserver::SetManager(EventManager *manager)
120 {
121     manager_ = manager;
122 }
123 } // namespace OHOS::NetManagerStandard
124