• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-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 "net_policy_callback.h"
17 
18 #include "net_mgr_log_wrapper.h"
19 #include "net_policy_constants.h"
20 #include "net_policy_inner_define.h"
21 
22 namespace OHOS {
23 namespace NetManagerStandard {
24 constexpr const char *NET_ACTIVATE_WORK_THREAD = "POLICY_CALLBACK_WORK_THREAD";
25 
NetPolicyCallback()26 NetPolicyCallback::NetPolicyCallback()
27 {
28     policyCallRunner_ = AppExecFwk::EventRunner::Create(NET_ACTIVATE_WORK_THREAD);
29     policyCallHandler_ = std::make_shared<AppExecFwk::EventHandler>(policyCallRunner_);
30 }
31 
~NetPolicyCallback()32 NetPolicyCallback::~NetPolicyCallback()
33 {
34     if (policyCallRunner_) {
35         policyCallRunner_->Stop();
36     }
37 }
38 
RegisterNetPolicyCallbackAsync(const sptr<INetPolicyCallback> & callback)39 int32_t NetPolicyCallback::RegisterNetPolicyCallbackAsync(const sptr<INetPolicyCallback> &callback)
40 {
41     if (callback == nullptr || callback->AsObject() == nullptr || callback->AsObject().GetRefPtr() == nullptr) {
42         NETMGR_LOG_E("The parameter callback is null");
43         return NETMANAGER_ERR_PARAMETER_ERROR;
44     }
45     int32_t ret = NETMANAGER_SUCCESS;
46     if (policyCallHandler_) {
47         policyCallHandler_->PostSyncTask([this, &callback, &ret]() {
48             ret = this->RegisterNetPolicyCallback(callback);
49         });
50     }
51 
52     return ret;
53 }
54 
RegisterNetPolicyCallback(const sptr<INetPolicyCallback> & callback)55 int32_t NetPolicyCallback::RegisterNetPolicyCallback(const sptr<INetPolicyCallback> &callback)
56 {
57     uint32_t callbackCounts = callbacks_.size();
58     NETMGR_LOG_I("callback counts [%{public}u]", callbackCounts);
59     if (callbackCounts >= LIMIT_CALLBACK_NUM) {
60         NETMGR_LOG_E("callback counts cannot more than [%{public}u]", LIMIT_CALLBACK_NUM);
61         return NETMANAGER_ERR_PARAMETER_ERROR;
62     }
63 
64     for (uint32_t i = 0; i < callbackCounts; i++) {
65         if (callback->AsObject().GetRefPtr() == callbacks_[i]->AsObject().GetRefPtr()) {
66             NETMGR_LOG_W("netPolicyCallback_ had this callback");
67             return NETMANAGER_ERR_PARAMETER_ERROR;
68         }
69     }
70 
71     callbacks_.emplace_back(callback);
72     NETMGR_LOG_I("End RegisterNetPolicyCallback");
73     return NETMANAGER_SUCCESS;
74 }
75 
UnregisterNetPolicyCallbackAsync(const sptr<INetPolicyCallback> & callback)76 int32_t NetPolicyCallback::UnregisterNetPolicyCallbackAsync(const sptr<INetPolicyCallback> &callback)
77 {
78     if (callback == nullptr || callback->AsObject() == nullptr || callback->AsObject().GetRefPtr() == nullptr) {
79         NETMGR_LOG_E("The parameter of callback is null");
80         return NETMANAGER_ERR_PARAMETER_ERROR;
81     }
82 
83     int32_t ret = NETMANAGER_SUCCESS;
84     if (policyCallHandler_) {
85         policyCallHandler_->PostSyncTask([this, &callback, &ret]() {
86             ret = this->UnregisterNetPolicyCallback(callback);
87         });
88     }
89 
90     return ret;
91 }
92 
UnregisterNetPolicyCallback(const sptr<INetPolicyCallback> & callback)93 int32_t NetPolicyCallback::UnregisterNetPolicyCallback(const sptr<INetPolicyCallback> &callback)
94 {
95     NETMGR_LOG_I("Enter UnregisterNetPolicyCallback");
96     auto it = std::remove_if(
97         callbacks_.begin(), callbacks_.end(), [callback](const sptr<INetPolicyCallback> &tempCallback) -> bool {
98             if (tempCallback == nullptr || tempCallback->AsObject() == nullptr ||
99                 tempCallback->AsObject().GetRefPtr() == nullptr) {
100                 return true;
101             }
102             return callback->AsObject().GetRefPtr() == tempCallback->AsObject().GetRefPtr();
103         });
104     callbacks_.erase(it, callbacks_.end());
105     NETMGR_LOG_I("End UnregisterNetPolicyCallback");
106     return NETMANAGER_SUCCESS;
107 }
108 
NotifyNetUidPolicyChangeAsync(uint32_t uid,uint32_t policy)109 int32_t NetPolicyCallback::NotifyNetUidPolicyChangeAsync(uint32_t uid, uint32_t policy)
110 {
111     NETMGR_LOG_D("NotifyNetUidPolicyChange uid[%{public}u] policy[%{public}u]", uid, policy);
112     int32_t ret = NETMANAGER_SUCCESS;
113     if (policyCallHandler_) {
114         policyCallHandler_->PostSyncTask([this, uid, policy, &ret]() {
115             ret = this->NotifyNetUidPolicyChange(uid, policy);
116         });
117     }
118 
119     return ret;
120 }
121 
NotifyNetUidPolicyChange(uint32_t uid,uint32_t policy)122 int32_t NetPolicyCallback::NotifyNetUidPolicyChange(uint32_t uid, uint32_t policy)
123 {
124     NETMGR_LOG_I("NotifyNetUidPolicyChange uid= %{public}d policy= %{public}d", uid, policy);
125     for (const auto &callback : callbacks_) {
126         if (callback != nullptr && callback->AsObject() != nullptr && callback->AsObject().GetRefPtr() != nullptr) {
127             callback->NetUidPolicyChange(uid, policy);
128         }
129     }
130 
131     return NETMANAGER_SUCCESS;
132 }
133 
NotifyNetUidRuleChangeAsync(uint32_t uid,uint32_t rule)134 int32_t NetPolicyCallback::NotifyNetUidRuleChangeAsync(uint32_t uid, uint32_t rule)
135 {
136     NETMGR_LOG_D("NotifyNetUidRuleChange uid[%{public}u] rule[%{public}u]", uid, rule);
137 
138     int32_t ret = NETMANAGER_SUCCESS;
139     if (policyCallHandler_) {
140         policyCallHandler_->PostSyncTask([this, uid, rule, &ret]() {
141             ret = this->NotifyNetUidRuleChange(uid, rule);
142         });
143     }
144     return ret;
145 }
146 
NotifyNetUidRuleChange(uint32_t uid,uint32_t rule)147 int32_t NetPolicyCallback::NotifyNetUidRuleChange(uint32_t uid, uint32_t rule)
148 {
149     NETMGR_LOG_I("NotifyNetUidRuleChange uid= %{public}d policy= %{public}d", uid, rule);
150     for (const auto &callback : callbacks_) {
151         if (callback != nullptr && callback->AsObject() != nullptr && callback->AsObject().GetRefPtr() != nullptr) {
152             callback->NetUidRuleChange(uid, rule);
153         }
154     }
155 
156     return NETMANAGER_SUCCESS;
157 }
158 
NotifyNetBackgroundPolicyChangeAsync(bool isAllowed)159 int32_t NetPolicyCallback::NotifyNetBackgroundPolicyChangeAsync(bool isAllowed)
160 {
161     NETMGR_LOG_D("NotifyNetBackgroundPolicyChange  isAllowed[%{public}d]", isAllowed);
162     int32_t ret = NETMANAGER_SUCCESS;
163     if (policyCallHandler_) {
164         policyCallHandler_->PostSyncTask([this, isAllowed, &ret]() {
165             ret = this->NotifyNetBackgroundPolicyChange(isAllowed);
166         });
167     }
168     return ret;
169 }
170 
NotifyNetBackgroundPolicyChange(bool isAllowed)171 int32_t NetPolicyCallback::NotifyNetBackgroundPolicyChange(bool isAllowed)
172 {
173     for (const auto &callback : callbacks_) {
174         if (callback != nullptr && callback->AsObject() != nullptr && callback->AsObject().GetRefPtr() != nullptr) {
175             callback->NetBackgroundPolicyChange(isAllowed);
176         }
177     }
178 
179     return NETMANAGER_SUCCESS;
180 }
181 
NotifyNetQuotaPolicyChangeAsync(const std::vector<NetQuotaPolicy> & quotaPolicies)182 int32_t NetPolicyCallback::NotifyNetQuotaPolicyChangeAsync(const std::vector<NetQuotaPolicy> &quotaPolicies)
183 {
184     if (quotaPolicies.empty()) {
185         NETMGR_LOG_E("NotifyNetQuotaPolicyChange quotaPolicies empty");
186         return POLICY_ERR_QUOTA_POLICY_NOT_EXIST;
187     }
188     NETMGR_LOG_D("NotifyNetQuotaPolicyChange quotaPolicies.size[%{public}zu]", quotaPolicies.size());
189 
190     int32_t ret = NETMANAGER_SUCCESS;
191     if (policyCallHandler_) {
192         policyCallHandler_->PostSyncTask([this, &quotaPolicies, &ret]() {
193             ret = this->NotifyNetQuotaPolicyChange(quotaPolicies);
194         });
195     }
196     return ret;
197 }
198 
NotifyNetQuotaPolicyChange(const std::vector<NetQuotaPolicy> & quotaPolicies)199 int32_t NetPolicyCallback::NotifyNetQuotaPolicyChange(const std::vector<NetQuotaPolicy> &quotaPolicies)
200 {
201     for (const auto &callback : callbacks_) {
202         if (callback != nullptr && callback->AsObject() != nullptr && callback->AsObject().GetRefPtr() != nullptr) {
203             callback->NetQuotaPolicyChange(quotaPolicies);
204         }
205     }
206 
207     return NETMANAGER_SUCCESS;
208 }
209 
NotifyNetMeteredIfacesChangeAsync(std::vector<std::string> & ifaces)210 int32_t NetPolicyCallback::NotifyNetMeteredIfacesChangeAsync(std::vector<std::string> &ifaces)
211 {
212     NETMGR_LOG_D("NotifyNetMeteredIfacesChange iface size[%{public}zu]", ifaces.size());
213     int32_t ret = NETMANAGER_SUCCESS;
214     if (policyCallHandler_) {
215         policyCallHandler_->PostSyncTask([this, &ifaces, &ret]() {
216             ret = this->NotifyNetMeteredIfacesChange(ifaces);
217         });
218     }
219     return ret;
220 }
221 
NotifyNetMeteredIfacesChange(std::vector<std::string> & ifaces)222 int32_t NetPolicyCallback::NotifyNetMeteredIfacesChange(std::vector<std::string> &ifaces)
223 {
224     NETMGR_LOG_D("NotifyNetMeteredIfacesChange iface size[%{public}zu]", ifaces.size());
225     for (const auto &callback : callbacks_) {
226         if (callback != nullptr && callback->AsObject() != nullptr && callback->AsObject().GetRefPtr() != nullptr) {
227             callback->NetMeteredIfacesChange(ifaces);
228         }
229     }
230 
231     return NETMANAGER_SUCCESS;
232 }
233 } // namespace NetManagerStandard
234 } // namespace OHOS
235