• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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 NetPolicyCallback::NetPolicyCallback() = default;
25 
26 NetPolicyCallback::~NetPolicyCallback() = default;
27 
RegisterNetPolicyCallback(const sptr<INetPolicyCallback> & callback)28 int32_t NetPolicyCallback::RegisterNetPolicyCallback(const sptr<INetPolicyCallback> &callback)
29 {
30     std::unique_lock<std::mutex> lock(callbackMutex_);
31     if (callback == nullptr || callback->AsObject() == nullptr || callback->AsObject().GetRefPtr() == nullptr) {
32         NETMGR_LOG_E("The parameter callback is null");
33         return NETMANAGER_ERR_PARAMETER_ERROR;
34     }
35 
36     uint32_t callbackCounts = callbacks_.size();
37     NETMGR_LOG_D("callback counts [%{public}u]", callbackCounts);
38     if (callbackCounts >= LIMIT_CALLBACK_NUM) {
39         NETMGR_LOG_E("callback counts cannot more than [%{public}u]", LIMIT_CALLBACK_NUM);
40         return NETMANAGER_ERR_PARAMETER_ERROR;
41     }
42 
43     for (uint32_t i = 0; i < callbackCounts; i++) {
44         if (callback->AsObject().GetRefPtr() == callbacks_[i]->AsObject().GetRefPtr()) {
45             NETMGR_LOG_W("netPolicyCallback_ had this callback");
46             return NETMANAGER_ERR_PARAMETER_ERROR;
47         }
48     }
49 
50     callbacks_.emplace_back(callback);
51     return NETMANAGER_SUCCESS;
52 }
53 
UnregisterNetPolicyCallback(const sptr<INetPolicyCallback> & callback)54 int32_t NetPolicyCallback::UnregisterNetPolicyCallback(const sptr<INetPolicyCallback> &callback)
55 {
56     std::unique_lock<std::mutex> lock(callbackMutex_);
57     if (callback == nullptr || callback->AsObject() == nullptr || callback->AsObject().GetRefPtr() == nullptr) {
58         NETMGR_LOG_E("The parameter of callback is null");
59         return NETMANAGER_ERR_PARAMETER_ERROR;
60     }
61 
62     auto it = std::remove_if(callbacks_.begin(), callbacks_.end(),
63                              [callback](const sptr<INetPolicyCallback> &tempCallback) -> bool {
64                                  if (tempCallback == nullptr || tempCallback->AsObject() == nullptr ||
65                                      tempCallback->AsObject().GetRefPtr() == nullptr) {
66                                      return true;
67                                  }
68                                  return callback->AsObject().GetRefPtr() == tempCallback->AsObject().GetRefPtr();
69                              });
70     callbacks_.erase(it, callbacks_.end());
71 
72     return NETMANAGER_SUCCESS;
73 }
74 
NotifyNetUidPolicyChange(uint32_t uid,uint32_t policy)75 int32_t NetPolicyCallback::NotifyNetUidPolicyChange(uint32_t uid, uint32_t policy)
76 {
77     NETMGR_LOG_D("NotifyNetUidPolicyChange uid[%{public}u] policy[%{public}u]", uid, policy);
78 
79     for (const auto &callback : callbacks_) {
80         if (callback != nullptr && callback->AsObject() != nullptr && callback->AsObject().GetRefPtr() != nullptr) {
81             callback->NetUidPolicyChange(uid, policy);
82         }
83     }
84 
85     return NETMANAGER_SUCCESS;
86 }
87 
NotifyNetUidRuleChange(uint32_t uid,uint32_t rule)88 int32_t NetPolicyCallback::NotifyNetUidRuleChange(uint32_t uid, uint32_t rule)
89 {
90     NETMGR_LOG_D("NotifyNetUidRuleChange uid[%{public}u] rule[%{public}u]", uid, rule);
91 
92     for (const auto &callback : callbacks_) {
93         if (callback != nullptr && callback->AsObject() != nullptr && callback->AsObject().GetRefPtr() != nullptr) {
94             callback->NetUidRuleChange(uid, rule);
95         }
96     }
97 
98     return NETMANAGER_SUCCESS;
99 }
100 
NotifyNetBackgroundPolicyChange(bool isAllowed)101 int32_t NetPolicyCallback::NotifyNetBackgroundPolicyChange(bool isAllowed)
102 {
103     NETMGR_LOG_D("NotifyNetBackgroundPolicyChange  isAllowed[%{public}d]", isAllowed);
104 
105     for (const auto &callback : callbacks_) {
106         if (callback != nullptr && callback->AsObject() != nullptr && callback->AsObject().GetRefPtr() != nullptr) {
107             callback->NetBackgroundPolicyChange(isAllowed);
108         }
109     }
110 
111     return NETMANAGER_SUCCESS;
112 }
113 
NotifyNetQuotaPolicyChange(const std::vector<NetQuotaPolicy> & quotaPolicies)114 int32_t NetPolicyCallback::NotifyNetQuotaPolicyChange(const std::vector<NetQuotaPolicy> &quotaPolicies)
115 {
116     if (quotaPolicies.empty()) {
117         NETMGR_LOG_E("NotifyNetQuotaPolicyChange quotaPolicies empty");
118         return POLICY_ERR_QUOTA_POLICY_NOT_EXIST;
119     }
120     NETMGR_LOG_D("NotifyNetQuotaPolicyChange quotaPolicies.size[%{public}zu]", quotaPolicies.size());
121 
122     for (const auto &callback : callbacks_) {
123         if (callback != nullptr && callback->AsObject() != nullptr && callback->AsObject().GetRefPtr() != nullptr) {
124             callback->NetQuotaPolicyChange(quotaPolicies);
125         }
126     }
127 
128     return NETMANAGER_SUCCESS;
129 }
130 
NotifyNetMeteredIfacesChange(std::vector<std::string> & ifaces)131 int32_t NetPolicyCallback::NotifyNetMeteredIfacesChange(std::vector<std::string> &ifaces)
132 {
133     NETMGR_LOG_D("NotifyNetMeteredIfacesChange iface size[%{public}zu]", ifaces.size());
134 
135     for (const auto &callback : callbacks_) {
136         if (callback != nullptr && callback->AsObject() != nullptr && callback->AsObject().GetRefPtr() != nullptr) {
137             callback->NetMeteredIfacesChange(ifaces);
138         }
139     }
140 
141     return NETMANAGER_SUCCESS;
142 }
143 } // namespace NetManagerStandard
144 } // namespace OHOS
145