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_stats_callback.h"
17 
18 #include "netsys_controller.h"
19 #include "net_stats_constants.h"
20 #include "net_mgr_log_wrapper.h"
21 #include "net_stats_constants.h"
22 
23 namespace OHOS {
24 namespace NetManagerStandard {
RegisterNetStatsCallback(const sptr<INetStatsCallback> & callback)25 void NetStatsCallback::RegisterNetStatsCallback(const sptr<INetStatsCallback> &callback)
26 {
27     if (callback == nullptr) {
28         NETMGR_LOG_E("The parameter callback is null");
29         return;
30     }
31     std::lock_guard<ffrt::mutex> lock(statsCallbackMetux_);
32     uint32_t callBackNum = netStatsCallback_.size();
33     NETMGR_LOG_D("netStatsCallback_ callback num [%{public}d]", callBackNum);
34     if (callBackNum >= LIMIT_STATS_CALLBACK_NUM) {
35         NETMGR_LOG_E("netStatsCallback_ callback num cannot more than [%{public}d]", LIMIT_STATS_CALLBACK_NUM);
36         return;
37     }
38 
39     for (uint32_t i = 0; i < callBackNum; i++) {
40         if (callback->AsObject().GetRefPtr() == netStatsCallback_[i]->AsObject().GetRefPtr()) {
41             NETMGR_LOG_I("netStatsCallback_ had this callback");
42             return;
43         }
44     }
45     NETMGR_LOG_I("netStatsCallback_ add callback.");
46     netStatsCallback_.emplace_back(callback);
47 }
48 
UnregisterNetStatsCallback(const sptr<INetStatsCallback> & callback)49 void NetStatsCallback::UnregisterNetStatsCallback(const sptr<INetStatsCallback> &callback)
50 {
51     if (callback == nullptr) {
52         NETMGR_LOG_E("The parameter of callback is null");
53         return;
54     }
55     std::lock_guard<ffrt::mutex> lock(statsCallbackMetux_);
56     for (auto iter = netStatsCallback_.begin(); iter != netStatsCallback_.end(); ++iter) {
57         if (callback->AsObject().GetRefPtr() == (*iter)->AsObject().GetRefPtr()) {
58             netStatsCallback_.erase(iter);
59             NETMGR_LOG_I("netStatsCallback_ erase callback.");
60             return;
61         }
62     }
63 }
64 
NotifyNetIfaceStatsChanged(const std::string & iface)65 int32_t NetStatsCallback::NotifyNetIfaceStatsChanged(const std::string &iface)
66 {
67     NETMGR_LOG_D("NotifyNetIfaceStatsChanged info: iface[%{public}s]", iface.c_str());
68     std::lock_guard<ffrt::mutex> lock(statsCallbackMetux_);
69     auto iter = std::remove_if(netStatsCallback_.begin(), netStatsCallback_.end(), [&iface](const auto &item) {
70         return item == nullptr || item->NetIfaceStatsChanged(iface) == NETMANAGER_ERR_IPC_CONNECT_STUB_FAIL;
71     });
72     netStatsCallback_.erase(iter, netStatsCallback_.end());
73     return NETMANAGER_SUCCESS;
74 }
75 
NotifyNetUidStatsChanged(const std::string & iface,uint32_t uid)76 int32_t NetStatsCallback::NotifyNetUidStatsChanged(const std::string &iface, uint32_t uid)
77 {
78     NETMGR_LOG_D("UpdateIfacesStats info: iface[%{public}s] uid[%{public}d]", iface.c_str(), uid);
79     std::lock_guard<ffrt::mutex> lock(statsCallbackMetux_);
80     auto iter = std::remove_if(netStatsCallback_.begin(), netStatsCallback_.end(), [&iface, uid](const auto &item) {
81         return item == nullptr || item->NetUidStatsChanged(iface, uid) == NETMANAGER_ERR_IPC_CONNECT_STUB_FAIL;
82     });
83     netStatsCallback_.erase(iter, netStatsCallback_.end());
84     return NETMANAGER_SUCCESS;
85 }
86 } // namespace NetManagerStandard
87 } // namespace OHOS
88