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 <string>
17 
18 #include <napi/native_api.h>
19 
20 #include "constant.h"
21 #include "get_cellular_rxbytes_context.h"
22 #include "get_iface_rxbytes_context.h"
23 #include "get_iface_stats_context.h"
24 #include "get_iface_uid_stats_context.h"
25 #include "get_traffic_stats_by_network_context.h"
26 #include "get_traffic_stats_by_uid_network_context.h"
27 #include "get_uid_rxbytes_context.h"
28 #include "module_template.h"
29 #include "napi_utils.h"
30 #include "statistics_async_work.h"
31 #include "statistics_callback_observer.h"
32 #include "statistics_exec.h"
33 #include "statistics_observer_wrapper.h"
34 #include "update_iface_stats_context.h"
35 
36 namespace OHOS {
37 namespace NetManagerStandard {
38 namespace {
39 constexpr const char *STATISTICS_MODULE_NAME = "net.statistics";
40 
41 constexpr const char *FUNCTION_GET_CELLULAR_RXBYTES = "getCellularRxBytes";
42 constexpr const char *FUNCTION_GET_CELLULAR_TXBYTES = "getCellularTxBytes";
43 constexpr const char *FUNCTION_GET_ALL_RXBYTES = "getAllRxBytes";
44 constexpr const char *FUNCTION_GET_ALL_TXBYTES = "getAllTxBytes";
45 constexpr const char *FUNCTION_GET_UID_RXBYTES = "getUidRxBytes";
46 constexpr const char *FUNCTION_GET_UID_TXBYTES = "getUidTxBytes";
47 constexpr const char *FUNCTION_GET_IFACE_RXBYTES = "getIfaceRxBytes";
48 constexpr const char *FUNCTION_GET_IFACE_TXBYTES = "getIfaceTxBytes";
49 constexpr const char *FUNCTION_GET_IFACE_STATS = "getTrafficStatsByIface";
50 constexpr const char *FUNCTION_GET_IFACE_UID_STATS = "getTrafficStatsByUid";
51 constexpr const char *FUNCTION_UPDATE_IFACE_STATS = "updateIfacesStats";
52 constexpr const char *FUNCTION_UPDATE_STATS_DATA = "updateStatsData";
53 constexpr const char *FUNCTION_ON = "on";
54 constexpr const char *FUNCTION_OFF = "off";
55 constexpr const char *FUNCTION_GET_SOCKFD_RXBYTES = "getSockfdRxBytes";
56 constexpr const char *FUNCTION_GET_SOCKFD_TXBYTES = "getSockfdTxBytes";
57 constexpr const char *FUNCTION_GET_TRAFFIC_STATS_BY_NETWORK = "getTrafficStatsByNetwork";
58 constexpr const char *FUNCTION_GET_TRAFFIC_STATS_BY_UID_NETWORK = "getTrafficStatsByUidNetwork";
59 } // namespace
60 
GetCellularRxBytes(napi_env env,napi_callback_info info)61 napi_value GetCellularRxBytes(napi_env env, napi_callback_info info)
62 {
63     return ModuleTemplate::Interface<GetCellularRxBytesContext>(env, info, FUNCTION_GET_CELLULAR_RXBYTES, nullptr,
64                                                                 StatisticsAsyncWork::ExecGetCellularRxBytes,
65                                                                 StatisticsAsyncWork::GetCellularRxBytesCallback);
66 }
67 
GetCellularTxBytes(napi_env env,napi_callback_info info)68 napi_value GetCellularTxBytes(napi_env env, napi_callback_info info)
69 {
70     return ModuleTemplate::Interface<GetCellularTxBytesContext>(env, info, FUNCTION_GET_CELLULAR_TXBYTES, nullptr,
71                                                                 StatisticsAsyncWork::ExecGetCellularTxBytes,
72                                                                 StatisticsAsyncWork::GetCellularTxBytesCallback);
73 }
74 
GetAllRxBytes(napi_env env,napi_callback_info info)75 napi_value GetAllRxBytes(napi_env env, napi_callback_info info)
76 {
77     return ModuleTemplate::Interface<GetAllRxBytesContext>(env, info, FUNCTION_GET_ALL_RXBYTES, nullptr,
78                                                            StatisticsAsyncWork::ExecGetAllRxBytes,
79                                                            StatisticsAsyncWork::GetAllRxBytesCallback);
80 }
81 
GetAllTxBytes(napi_env env,napi_callback_info info)82 napi_value GetAllTxBytes(napi_env env, napi_callback_info info)
83 {
84     return ModuleTemplate::Interface<GetAllTxBytesContext>(env, info, FUNCTION_GET_ALL_TXBYTES, nullptr,
85                                                            StatisticsAsyncWork::ExecGetAllTxBytes,
86                                                            StatisticsAsyncWork::GetAllTxBytesCallback);
87 }
88 
GetUidRxBytes(napi_env env,napi_callback_info info)89 napi_value GetUidRxBytes(napi_env env, napi_callback_info info)
90 {
91     return ModuleTemplate::Interface<GetUidRxBytesContext>(env, info, FUNCTION_GET_UID_RXBYTES, nullptr,
92                                                            StatisticsAsyncWork::ExecGetUidRxBytes,
93                                                            StatisticsAsyncWork::GetUidRxBytesCallback);
94 }
95 
GetUidTxBytes(napi_env env,napi_callback_info info)96 napi_value GetUidTxBytes(napi_env env, napi_callback_info info)
97 {
98     return ModuleTemplate::Interface<GetUidTxBytesContext>(env, info, FUNCTION_GET_UID_TXBYTES, nullptr,
99                                                            StatisticsAsyncWork::ExecGetUidTxBytes,
100                                                            StatisticsAsyncWork::GetUidTxBytesCallback);
101 }
102 
GetSockfdRxBytes(napi_env env,napi_callback_info info)103 napi_value GetSockfdRxBytes(napi_env env, napi_callback_info info)
104 {
105     return ModuleTemplate::Interface<GetSockfdRxBytesContext>(env, info, FUNCTION_GET_SOCKFD_RXBYTES, nullptr,
106                                                               StatisticsAsyncWork::ExecGetSockfdRxBytes,
107                                                               StatisticsAsyncWork::GetSockfdRxBytesCallback);
108 }
109 
GetSockfdTxBytes(napi_env env,napi_callback_info info)110 napi_value GetSockfdTxBytes(napi_env env, napi_callback_info info)
111 {
112     return ModuleTemplate::Interface<GetSockfdTxBytesContext>(env, info, FUNCTION_GET_SOCKFD_TXBYTES, nullptr,
113                                                               StatisticsAsyncWork::ExecGetSockfdTxBytes,
114                                                               StatisticsAsyncWork::GetSockfdTxBytesCallback);
115 }
116 
GetIfaceRxBytes(napi_env env,napi_callback_info info)117 napi_value GetIfaceRxBytes(napi_env env, napi_callback_info info)
118 {
119     return ModuleTemplate::Interface<GetIfaceRxBytesContext>(env, info, FUNCTION_GET_IFACE_RXBYTES, nullptr,
120                                                              StatisticsAsyncWork::ExecGetIfaceRxBytes,
121                                                              StatisticsAsyncWork::GetIfaceRxBytesCallback);
122 }
123 
GetIfaceTxBytes(napi_env env,napi_callback_info info)124 napi_value GetIfaceTxBytes(napi_env env, napi_callback_info info)
125 {
126     return ModuleTemplate::Interface<GetIfaceTxBytesContext>(env, info, FUNCTION_GET_IFACE_TXBYTES, nullptr,
127                                                              StatisticsAsyncWork::ExecGetIfaceTxBytes,
128                                                              StatisticsAsyncWork::GetIfaceTxBytesCallback);
129 }
130 
GetIfaceStats(napi_env env,napi_callback_info info)131 napi_value GetIfaceStats(napi_env env, napi_callback_info info)
132 {
133     return ModuleTemplate::Interface<GetIfaceStatsContext>(env, info, FUNCTION_GET_IFACE_STATS, nullptr,
134                                                            StatisticsAsyncWork::ExecGetIfaceStats,
135                                                            StatisticsAsyncWork::GetIfaceStatsCallback);
136 }
137 
GetIfaceUidStats(napi_env env,napi_callback_info info)138 napi_value GetIfaceUidStats(napi_env env, napi_callback_info info)
139 {
140     return ModuleTemplate::Interface<GetIfaceUidStatsContext>(env, info, FUNCTION_GET_IFACE_UID_STATS, nullptr,
141                                                               StatisticsAsyncWork::ExecGetIfaceUidStats,
142                                                               StatisticsAsyncWork::GetIfaceUidStatsCallback);
143 }
144 
GetTrafficStatsByNetwork(napi_env env,napi_callback_info info)145 napi_value GetTrafficStatsByNetwork(napi_env env, napi_callback_info info)
146 {
147     return ModuleTemplate::Interface<GetTrafficStatsByNetworkContext>(
148         env, info, FUNCTION_GET_TRAFFIC_STATS_BY_NETWORK, nullptr, StatisticsAsyncWork::ExecGetTrafficStatsByNetwork,
149         StatisticsAsyncWork::GetTrafficStatsByNetworkCallback);
150 }
151 
GetTrafficStatsByUidNetwork(napi_env env,napi_callback_info info)152 napi_value GetTrafficStatsByUidNetwork(napi_env env, napi_callback_info info)
153 {
154     return ModuleTemplate::Interface<GetTrafficStatsByUidNetworkContext>(
155         env, info, FUNCTION_GET_TRAFFIC_STATS_BY_UID_NETWORK, nullptr,
156         StatisticsAsyncWork::ExecGetTrafficStatsByUidNetwork, StatisticsAsyncWork::GetTrafficStatsByUidNetworkCallback);
157 }
158 
UpdateIfacesStats(napi_env env,napi_callback_info info)159 napi_value UpdateIfacesStats(napi_env env, napi_callback_info info)
160 {
161     return ModuleTemplate::Interface<UpdateIfacesStatsContext>(env, info, FUNCTION_UPDATE_IFACE_STATS, nullptr,
162                                                                StatisticsAsyncWork::ExecUpdateIfacesStats,
163                                                                StatisticsAsyncWork::UpdateIfacesStatsCallback);
164 }
165 
UpdateStatsData(napi_env env,napi_callback_info info)166 napi_value UpdateStatsData(napi_env env, napi_callback_info info)
167 {
168     return ModuleTemplate::Interface<UpdateStatsDataContext>(env, info, FUNCTION_UPDATE_STATS_DATA, nullptr,
169                                                              StatisticsAsyncWork::ExecUpdateStatsData,
170                                                              StatisticsAsyncWork::UpdateStatsDataCallback);
171 }
172 
On(napi_env env,napi_callback_info info)173 napi_value On(napi_env env, napi_callback_info info)
174 {
175     return StatisticsObserverWrapper::GetInstance().On(env, info, {EVENT_STATS_CHANGE}, false);
176 }
177 
Off(napi_env env,napi_callback_info info)178 napi_value Off(napi_env env, napi_callback_info info)
179 {
180     return StatisticsObserverWrapper::GetInstance().Off(env, info, {EVENT_STATS_CHANGE}, false);
181 }
182 
InitStatisticsModule(napi_env env,napi_value exports)183 napi_value InitStatisticsModule(napi_env env, napi_value exports)
184 {
185     NapiUtils::DefineProperties(
186         env, exports,
187         {
188             DECLARE_NAPI_FUNCTION(FUNCTION_GET_CELLULAR_RXBYTES, GetCellularRxBytes),
189             DECLARE_NAPI_FUNCTION(FUNCTION_GET_CELLULAR_TXBYTES, GetCellularTxBytes),
190             DECLARE_NAPI_FUNCTION(FUNCTION_GET_ALL_RXBYTES, GetAllRxBytes),
191             DECLARE_NAPI_FUNCTION(FUNCTION_GET_ALL_TXBYTES, GetAllTxBytes),
192             DECLARE_NAPI_FUNCTION(FUNCTION_GET_UID_RXBYTES, GetUidRxBytes),
193             DECLARE_NAPI_FUNCTION(FUNCTION_GET_UID_TXBYTES, GetUidTxBytes),
194             DECLARE_NAPI_FUNCTION(FUNCTION_GET_SOCKFD_RXBYTES, GetSockfdRxBytes),
195             DECLARE_NAPI_FUNCTION(FUNCTION_GET_SOCKFD_TXBYTES, GetSockfdTxBytes),
196             DECLARE_NAPI_FUNCTION(FUNCTION_GET_IFACE_RXBYTES, GetIfaceRxBytes),
197             DECLARE_NAPI_FUNCTION(FUNCTION_GET_IFACE_TXBYTES, GetIfaceTxBytes),
198             DECLARE_NAPI_FUNCTION(FUNCTION_GET_IFACE_STATS, GetIfaceStats),
199             DECLARE_NAPI_FUNCTION(FUNCTION_GET_IFACE_UID_STATS, GetIfaceUidStats),
200             DECLARE_NAPI_FUNCTION(FUNCTION_GET_TRAFFIC_STATS_BY_NETWORK, GetTrafficStatsByNetwork),
201             DECLARE_NAPI_FUNCTION(FUNCTION_GET_TRAFFIC_STATS_BY_UID_NETWORK, GetTrafficStatsByUidNetwork),
202             DECLARE_NAPI_FUNCTION(FUNCTION_UPDATE_IFACE_STATS, UpdateIfacesStats),
203             DECLARE_NAPI_FUNCTION(FUNCTION_UPDATE_STATS_DATA, UpdateStatsData),
204             DECLARE_NAPI_FUNCTION(FUNCTION_ON, On),
205             DECLARE_NAPI_FUNCTION(FUNCTION_OFF, Off),
206         });
207     NapiUtils::SetEnvValid(env);
208     napi_add_env_cleanup_hook(env, NapiUtils::HookForEnvCleanup, env);
209     return exports;
210 }
211 
212 static napi_module g_statisticsModule = {
213     .nm_version = 1,
214     .nm_flags = 0,
215     .nm_filename = nullptr,
216     .nm_register_func = InitStatisticsModule,
217     .nm_modname = STATISTICS_MODULE_NAME,
218     .nm_priv = nullptr,
219     .reserved = {nullptr},
220 };
221 
RegisterNetStatsModule(void)222 extern "C" __attribute__((constructor)) void RegisterNetStatsModule(void)
223 {
224     napi_module_register(&g_statisticsModule);
225 }
226 } // namespace NetManagerStandard
227 } // namespace OHOS
228