1 /*
2 * Copyright (c) 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 <string>
17 #include "securec.h"
18
19 #include "bundle_active_log.h"
20 #include "bundle_state_common.h"
21 #include "bundle_state_data.h"
22 #include "bundle_state_query_napi.h"
23 #include "app_group_observer_napi.h"
24 #include "bundle_state_inner_errors.h"
25
26 namespace OHOS {
27 namespace DeviceUsageStats {
28 const uint32_t IS_IDLE_STATE_MIN_PARAMS = 1;
29 const uint32_t IS_IDLE_STATE_PARAMS = 2;
30 const uint32_t STATES_MIN_PARAMS = 2;
31 const uint32_t STATES_PARAMS = 3;
32 const uint32_t APP_USAGE_MIN_PARAMS_BY_INTERVAL = 3;
33 const uint32_t APP_USAGE_PARAMS_BY_INTERVAL = 4;
34 const uint32_t APP_USAGE_MIN_PARAMS = 2;
35 const uint32_t APP_USAGE_PARAMS = 3;
36 const uint32_t MODULE_RECORDS_MIN_PARAMS = 0;
37 const uint32_t MODULE_RECORDS_MIDDLE_PARAMS = 1;
38 const uint32_t MODULE_RECORDS_PARAMS = 2;
39 const uint32_t ZERO_ARG = 0;
40 const uint32_t FIRST_ARG = 1;
41 const uint32_t SECOND_ARG = 2;
42 const uint32_t THIRD_ARG = 3;
43 const int32_t MAXNUM_UP_LIMIT = 1000;
44 const std::vector<int32_t> GROUP_TYPE {10, 20, 30, 40, 50, 60};
45 const uint32_t EVENT_STATES_MIN_PARAMS = 2;
46 const uint32_t EVENT_STATES_PARAMS = 3;
47
GetCallBackParameters(const napi_env & env,napi_value * argv,int32_t index,ModuleRecordParamsInfo & params)48 napi_value GetCallBackParameters(const napi_env &env, napi_value* argv, int32_t index, ModuleRecordParamsInfo ¶ms)
49 {
50 napi_valuetype valuetype = napi_undefined;
51 NAPI_CALL(env, napi_typeof(env, argv[index], &valuetype));
52 if (valuetype != napi_function) {
53 params.errorCode = ERR_CALL_BACK_TYPE;
54 return BundleStateCommon::HandleParamErr(env, ERR_CALL_BACK_TYPE, "");
55 }
56 napi_create_reference(env, argv[index], 1, ¶ms.callback);
57 return BundleStateCommon::NapiGetNull(env);
58 }
59
ParseQueryModuleUsageRecords(const napi_env & env,const napi_callback_info & info,ModuleRecordParamsInfo & params,AsyncCallbackInfoModuleRecord * & asyncCallbackInfo)60 napi_value ParseQueryModuleUsageRecords(const napi_env &env, const napi_callback_info &info,
61 ModuleRecordParamsInfo ¶ms, AsyncCallbackInfoModuleRecord*& asyncCallbackInfo)
62 {
63 size_t argc = MODULE_RECORDS_PARAMS;
64 napi_value argv[MODULE_RECORDS_PARAMS] = {nullptr};
65 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
66 if ((argc != MODULE_RECORDS_MIN_PARAMS) && (argc != MODULE_RECORDS_MIDDLE_PARAMS) &&
67 (argc != MODULE_RECORDS_PARAMS)) {
68 params.errorCode = ERR_PARAMETERS_NUMBER;
69 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_NUMBER, "");
70 }
71 if (argc == MODULE_RECORDS_MIN_PARAMS) {
72 params.maxNum = MAXNUM_UP_LIMIT;
73 } else if (argc == MODULE_RECORDS_MIDDLE_PARAMS) {
74 if (BundleStateCommon::GetInt32NumberValue(env, argv[0], params.maxNum) == nullptr) {
75 BUNDLE_ACTIVE_LOGI("get module info has only one callback param");
76 GetCallBackParameters(env, argv, ZERO_ARG, params);
77 if (params.errorCode != ERR_OK) {
78 return BundleStateCommon::NapiGetNull(env);
79 }
80 params.maxNum = MAXNUM_UP_LIMIT;
81 } else if (params.maxNum > MAXNUM_UP_LIMIT || params.maxNum <= 0) {
82 BUNDLE_ACTIVE_LOGE("ParseQueryModuleUsageRecords failed, maxNum is larger than 1000 or less/equal than 0");
83 params.errorCode = ERR_MAX_RECORDS_NUM_BIGER_THEN_ONE_THOUSAND;
84 return BundleStateCommon::HandleParamErr(env, ERR_MAX_RECORDS_NUM_BIGER_THEN_ONE_THOUSAND, "");
85 }
86 } else if (argc == MODULE_RECORDS_PARAMS) {
87 // argv[0] : maxNum
88 if (BundleStateCommon::GetInt32NumberValue(env, argv[0], params.maxNum) == nullptr) {
89 BUNDLE_ACTIVE_LOGE("ParseQueryModuleUsageRecords failed, maxNum type is invalid.");
90 params.errorCode = ERR_MAX_RECORDS_NUM_TYPE;
91 return BundleStateCommon::HandleParamErr(env, ERR_MAX_RECORDS_NUM_TYPE, "");
92 }
93 if (params.maxNum > MAXNUM_UP_LIMIT || params.maxNum <= 0) {
94 BUNDLE_ACTIVE_LOGE("ParseQueryModuleUsageRecords failed, maxNum is larger than 1000 or less/equal than 0");
95 params.errorCode = ERR_MAX_RECORDS_NUM_BIGER_THEN_ONE_THOUSAND;
96 return BundleStateCommon::HandleParamErr(env, ERR_MAX_RECORDS_NUM_BIGER_THEN_ONE_THOUSAND, "");
97 }
98 // argv[1] : callback
99 GetCallBackParameters(env, argv, FIRST_ARG, params);
100 if (params.errorCode != ERR_OK) {
101 return BundleStateCommon::NapiGetNull(env);
102 }
103 }
104 BundleStateCommon::AsyncInit(env, params, asyncCallbackInfo);
105 return BundleStateCommon::NapiGetNull(env);
106 }
107
QueryModuleUsageRecordsAsync(napi_env env,void * data)108 void QueryModuleUsageRecordsAsync(napi_env env, void *data)
109 {
110 AsyncCallbackInfoModuleRecord *asyncCallbackInfo = (AsyncCallbackInfoModuleRecord *)data;
111 if (asyncCallbackInfo != nullptr) {
112 asyncCallbackInfo->errorCode =
113 BundleActiveClient::GetInstance().QueryModuleUsageRecords(asyncCallbackInfo->maxNum,
114 asyncCallbackInfo->moduleRecords);
115 } else {
116 BUNDLE_ACTIVE_LOGE("QueryBundleStatsInfoByInterval, asyncCallbackInfo == nullptr");
117 }
118 }
119
QueryModuleUsageRecordsAsyncCB(napi_env env,napi_status status,void * data)120 void QueryModuleUsageRecordsAsyncCB(napi_env env, napi_status status, void *data)
121 {
122 AsyncCallbackInfoModuleRecord *asyncCallbackInfo = (AsyncCallbackInfoModuleRecord *)data;
123 if (asyncCallbackInfo != nullptr) {
124 napi_value result = nullptr;
125 napi_create_array(env, &result);
126 BundleStateCommon::GetModuleRecordForResult(env, asyncCallbackInfo->moduleRecords, result);
127 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
128 }
129 }
130
QueryModuleUsageRecords(napi_env env,napi_callback_info info)131 napi_value QueryModuleUsageRecords(napi_env env, napi_callback_info info)
132 {
133 ModuleRecordParamsInfo params;
134 AsyncCallbackInfoModuleRecord *asyncCallbackInfo = nullptr;
135 ParseQueryModuleUsageRecords(env, info, params, asyncCallbackInfo);
136 if (params.errorCode != ERR_OK) {
137 BundleStateCommon::DeleteNapiReference(env, params.callback);
138 return BundleStateCommon::NapiGetNull(env);
139 }
140 napi_value promise = nullptr;
141 std::unique_ptr<AsyncCallbackInfoModuleRecord> callbackPtr {asyncCallbackInfo};
142 callbackPtr->maxNum = params.maxNum;
143 BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
144 napi_value resourceName = nullptr;
145 NAPI_CALL(env, napi_create_string_latin1(env, "QueryModuleUsageRecords", NAPI_AUTO_LENGTH, &resourceName));
146 NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, QueryModuleUsageRecordsAsync,
147 QueryModuleUsageRecordsAsyncCB, static_cast<void*>(asyncCallbackInfo), &asyncCallbackInfo->asyncWork));
148 NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
149 if (callbackPtr->isCallback) {
150 callbackPtr.release();
151 return BundleStateCommon::NapiGetNull(env);
152 } else {
153 callbackPtr.release();
154 return promise;
155 }
156 }
157
ParseIsIdleStateParameters(const napi_env & env,const napi_callback_info & info,IsIdleStateParamsInfo & params,AsyncCallbackInfoIsIdleState * & asyncCallbackInfo)158 napi_value ParseIsIdleStateParameters(const napi_env &env, const napi_callback_info &info,
159 IsIdleStateParamsInfo ¶ms, AsyncCallbackInfoIsIdleState*& asyncCallbackInfo)
160 {
161 size_t argc = IS_IDLE_STATE_PARAMS;
162 napi_value argv[IS_IDLE_STATE_PARAMS] = {nullptr};
163 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
164 NAPI_ASSERT(env, argc == IS_IDLE_STATE_MIN_PARAMS || argc == IS_IDLE_STATE_PARAMS,
165 "Invalid number of parameters");
166 if ((argc != IS_IDLE_STATE_MIN_PARAMS) && (argc != IS_IDLE_STATE_PARAMS)) {
167 params.errorCode = ERR_PARAMETERS_NUMBER;
168 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_NUMBER, "");
169 }
170
171 // argv[0] : bundleName
172 std::string result = "";
173 napi_valuetype valuetype;
174 NAPI_CALL(env, napi_typeof(env, argv[0], &valuetype));
175 if (valuetype != napi_string) {
176 BUNDLE_ACTIVE_LOGE("Wrong argument type, string expected.");
177 params.errorCode = ERR_BUNDLE_NAME_TYPE;
178 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_NUMBER, "");
179 }
180
181 params.bundleName = BundleStateCommon::GetTypeStringValue(env, argv[0], result);
182 if (params.bundleName.empty()) {
183 BUNDLE_ACTIVE_LOGE("ParseIsIdleStateParameters failed, bundleName is empty.");
184 params.errorCode = ERR_PARAMETERS_EMPTY;
185 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_NUMBER, "bundleName");
186 }
187
188 // argv[1]: callback
189 if (argc == IS_IDLE_STATE_PARAMS) {
190 napi_valuetype inputValueType = napi_undefined;
191 NAPI_CALL(env, napi_typeof(env, argv[1], &inputValueType));
192 if (inputValueType != napi_function) {
193 params.errorCode = ERR_CALL_BACK_TYPE;
194 return BundleStateCommon::HandleParamErr(env, ERR_CALL_BACK_TYPE, "");
195 }
196 napi_create_reference(env, argv[1], 1, ¶ms.callback);
197 }
198 BundleStateCommon::AsyncInit(env, params, asyncCallbackInfo);
199 return BundleStateCommon::NapiGetNull(env);
200 }
201
IsBundleIdleAsync(napi_env env,void * data)202 void IsBundleIdleAsync(napi_env env, void *data)
203 {
204 AsyncCallbackInfoIsIdleState *asyncCallbackInfo = (AsyncCallbackInfoIsIdleState *)data;
205 if (asyncCallbackInfo != nullptr) {
206 asyncCallbackInfo->errorCode = BundleActiveClient::GetInstance().IsBundleIdle(
207 asyncCallbackInfo->state, asyncCallbackInfo->bundleName);
208 } else {
209 BUNDLE_ACTIVE_LOGE("IsIdleState, asyncCallbackInfo == nullptr");
210 }
211 }
212
IsBundleIdleAsyncCB(napi_env env,napi_status status,void * data)213 void IsBundleIdleAsyncCB(napi_env env, napi_status status, void *data)
214 {
215 AsyncCallbackInfoIsIdleState *asyncCallbackInfo = (AsyncCallbackInfoIsIdleState *)data;
216 if (asyncCallbackInfo != nullptr) {
217 napi_value result = nullptr;
218 napi_get_boolean(env, asyncCallbackInfo->state, &result);
219 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
220 }
221 }
222
IsIdleState(napi_env env,napi_callback_info info)223 napi_value IsIdleState(napi_env env, napi_callback_info info)
224 {
225 IsIdleStateParamsInfo params;
226 AsyncCallbackInfoIsIdleState *asyncCallbackInfo = nullptr;
227 ParseIsIdleStateParameters(env, info, params, asyncCallbackInfo);
228 if (params.errorCode != ERR_OK && !asyncCallbackInfo) {
229 BundleStateCommon::DeleteNapiReference(env, params.callback);
230 return BundleStateCommon::NapiGetNull(env);
231 }
232 napi_value promise = nullptr;
233 std::unique_ptr<AsyncCallbackInfoIsIdleState> callbackPtr {asyncCallbackInfo};
234 callbackPtr->bundleName = params.bundleName;
235 BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
236 napi_value resourceName = nullptr;
237 NAPI_CALL(env, napi_create_string_latin1(env, "IsIdleState", NAPI_AUTO_LENGTH, &resourceName));
238 NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, IsBundleIdleAsync, IsBundleIdleAsyncCB,
239 static_cast<void*>(asyncCallbackInfo), &asyncCallbackInfo->asyncWork));
240 NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
241 if (callbackPtr->isCallback) {
242 callbackPtr.release();
243 return BundleStateCommon::NapiGetNull(env);
244 } else {
245 callbackPtr.release();
246 return promise;
247 }
248 }
249
ParseIsIdleStateSyncParameters(const napi_env & env,const napi_callback_info & info,IsIdleStateParamsInfo & params)250 napi_value ParseIsIdleStateSyncParameters(const napi_env &env, const napi_callback_info &info,
251 IsIdleStateParamsInfo ¶ms)
252 {
253 size_t argc = IS_IDLE_STATE_PARAMS;
254 napi_value argv[IS_IDLE_STATE_PARAMS] = {nullptr};
255 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
256 NAPI_ASSERT(env, argc == IS_IDLE_STATE_MIN_PARAMS, "Invalid number of parameters");
257 if ((argc != IS_IDLE_STATE_MIN_PARAMS)) {
258 params.errorCode = ERR_PARAMETERS_NUMBER;
259 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_NUMBER, "");
260 }
261
262 // argv[0] : bundleName
263 std::string result = "";
264 napi_valuetype valuetype;
265 NAPI_CALL(env, napi_typeof(env, argv[0], &valuetype));
266 if (valuetype != napi_string) {
267 BUNDLE_ACTIVE_LOGE("Wrong argument type, string expected.");
268 params.errorCode = ERR_BUNDLE_NAME_TYPE;
269 return BundleStateCommon::HandleParamErr(env, ERR_BUNDLE_NAME_TYPE, "");
270 }
271
272 params.bundleName = BundleStateCommon::GetTypeStringValue(env, argv[0], result);
273 if (params.bundleName.empty()) {
274 BUNDLE_ACTIVE_LOGE("ParseIsIdleStateParameters failed, bundleName is empty.");
275 params.errorCode = ERR_PARAMETERS_EMPTY;
276 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_EMPTY, "bundleName");
277 }
278 return BundleStateCommon::NapiGetNull(env);
279 }
280
IsIdleStateSync(napi_env env,napi_callback_info info)281 napi_value IsIdleStateSync(napi_env env, napi_callback_info info)
282 {
283 IsIdleStateParamsInfo params;
284 ParseIsIdleStateSyncParameters(env, info, params);
285 bool isIdleState = false;
286 ErrCode errorCode = BundleActiveClient::GetInstance().IsBundleIdle(
287 isIdleState, params.bundleName);
288 if (errorCode == ERR_OK) {
289 napi_value napiValue = nullptr;
290 NAPI_CALL(env, napi_get_boolean(env, isIdleState, &napiValue));
291 return napiValue;
292 }
293 return BundleStateCommon::GetErrorValue(env, errorCode);
294 }
295
ParseQueryCurrentBundleEventsParameters(const napi_env & env,const napi_callback_info & info,StatesParamsInfo & params,AsyncCallbackInfoStates * & asyncCallbackInfo)296 napi_value ParseQueryCurrentBundleEventsParameters(const napi_env &env, const napi_callback_info &info,
297 StatesParamsInfo ¶ms, AsyncCallbackInfoStates*& asyncCallbackInfo)
298 {
299 size_t argc = STATES_PARAMS;
300 napi_value argv[STATES_PARAMS] = {nullptr};
301 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
302 if ((argc != STATES_MIN_PARAMS) && (argc != STATES_PARAMS)) {
303 params.errorCode = ERR_PARAMETERS_NUMBER;
304 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_NUMBER, "");
305 }
306 // argv[0] : beginTime
307 if (BundleStateCommon::GetInt64NumberValue(env, argv[0], params.beginTime) == nullptr) {
308 BUNDLE_ACTIVE_LOGE("ParseQueryCurrentBundleEventsParameters failed, beginTime type is invalid.");
309 params.errorCode = ERR_BEGIN_TIME_TYPE;
310 return BundleStateCommon::HandleParamErr(env, ERR_BEGIN_TIME_TYPE, "");
311 }
312 if (params.beginTime < TIME_NUMBER_MIN) {
313 BUNDLE_ACTIVE_LOGE("ParseQueryCurrentBundleEventsParameters failed, beginTime value is invalid.");
314 params.errorCode = ERR_BEGIN_TIME_LESS_THEN_ZERO;
315 return BundleStateCommon::HandleParamErr(env, ERR_BEGIN_TIME_LESS_THEN_ZERO, "");
316 }
317 // argv[1] : endTime
318 if (BundleStateCommon::GetInt64NumberValue(env, argv[1], params.endTime) == nullptr) {
319 BUNDLE_ACTIVE_LOGE("ParseQueryCurrentBundleEventsParameters failed, endTime type is invalid.");
320 params.errorCode = ERR_END_TIME_TYPE;
321 return BundleStateCommon::HandleParamErr(env, ERR_END_TIME_TYPE, "");
322 }
323 if (params.endTime <= params.beginTime) {
324 BUNDLE_ACTIVE_LOGE("ParseQueryCurrentBundleEventsParameters endTime(%{public}lld) <= beginTime(%{public}lld)",
325 (long long)params.endTime, (long long)params.beginTime);
326 params.errorCode = ERR_END_TIME_LESS_THEN_BEGIN_TIME;
327 return BundleStateCommon::HandleParamErr(env, ERR_END_TIME_LESS_THEN_BEGIN_TIME, "");
328 }
329 // argv[SECOND_ARG]: callback
330 if (argc == STATES_PARAMS) {
331 napi_valuetype valuetype = napi_undefined;
332 NAPI_CALL(env, napi_typeof(env, argv[SECOND_ARG], &valuetype));
333 if (valuetype != napi_function) {
334 params.errorCode = ERR_CALL_BACK_TYPE;
335 return BundleStateCommon::HandleParamErr(env, ERR_CALL_BACK_TYPE, "");
336 }
337 napi_create_reference(env, argv[SECOND_ARG], 1, ¶ms.callback);
338 }
339 BundleStateCommon::AsyncInit(env, params, asyncCallbackInfo);
340 return BundleStateCommon::NapiGetNull(env);
341 }
342
QueryCurrentBundleEventsAsync(napi_env env,void * data)343 void QueryCurrentBundleEventsAsync(napi_env env, void *data)
344 {
345 AsyncCallbackInfoStates *asyncCallbackInfo = (AsyncCallbackInfoStates *)data;
346 if (asyncCallbackInfo != nullptr) {
347 asyncCallbackInfo->errorCode =
348 BundleActiveClient::GetInstance().QueryCurrentBundleEvents(asyncCallbackInfo->BundleActiveState,
349 asyncCallbackInfo->beginTime, asyncCallbackInfo->endTime);
350 } else {
351 BUNDLE_ACTIVE_LOGE("QueryCurrentBundleEvents, asyncCallbackInfo == nullptr");
352 }
353 }
354
QueryCurrentBundleEventsAsyncCB(napi_env env,napi_status status,void * data)355 void QueryCurrentBundleEventsAsyncCB(napi_env env, napi_status status, void *data)
356 {
357 AsyncCallbackInfoStates *asyncCallbackInfo = (AsyncCallbackInfoStates *)data;
358 if (asyncCallbackInfo != nullptr) {
359 napi_value result = nullptr;
360 napi_create_array(env, &result);
361 BundleStateCommon::GetBundleActiveEventForResult(
362 env, asyncCallbackInfo->BundleActiveState, result, true);
363 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
364 }
365 }
366
QueryCurrentBundleEvents(napi_env env,napi_callback_info info)367 napi_value QueryCurrentBundleEvents(napi_env env, napi_callback_info info)
368 {
369 StatesParamsInfo params;
370 AsyncCallbackInfoStates *asyncCallbackInfo = nullptr;
371 ParseQueryCurrentBundleEventsParameters(env, info, params, asyncCallbackInfo);
372 if (params.errorCode != ERR_OK && !asyncCallbackInfo) {
373 BundleStateCommon::DeleteNapiReference(env, params.callback);
374 return BundleStateCommon::NapiGetNull(env);
375 }
376 napi_value promise = nullptr;
377 std::unique_ptr<AsyncCallbackInfoStates> callbackPtr {asyncCallbackInfo};
378 callbackPtr->beginTime = params.beginTime;
379 BUNDLE_ACTIVE_LOGD("QueryCurrentBundleEvents callbackPtr->beginTime: %{public}lld",
380 (long long)callbackPtr->beginTime);
381 callbackPtr->endTime = params.endTime;
382 BUNDLE_ACTIVE_LOGD("QueryCurrentBundleEvents callbackPtr->endTime: %{public}lld",
383 (long long)callbackPtr->endTime);
384 BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
385
386 napi_value resourceName = nullptr;
387 NAPI_CALL(env, napi_create_string_latin1(env, "QueryCurrentBundleEvents", NAPI_AUTO_LENGTH, &resourceName));
388 NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, QueryCurrentBundleEventsAsync,
389 QueryCurrentBundleEventsAsyncCB, static_cast<void*>(asyncCallbackInfo), &asyncCallbackInfo->asyncWork));
390 NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
391 if (callbackPtr->isCallback) {
392 callbackPtr.release();
393 return BundleStateCommon::NapiGetNull(env);
394 } else {
395 callbackPtr.release();
396 return promise;
397 }
398 }
399
QueryBundleEventsAsync(napi_env env,void * data)400 void QueryBundleEventsAsync(napi_env env, void *data)
401 {
402 AsyncCallbackInfoStates *asyncCallbackInfo = (AsyncCallbackInfoStates *)data;
403 if (asyncCallbackInfo != nullptr) {
404 asyncCallbackInfo->errorCode =
405 BundleActiveClient::GetInstance().QueryBundleEvents(asyncCallbackInfo->BundleActiveState,
406 asyncCallbackInfo->beginTime, asyncCallbackInfo->endTime);
407 } else {
408 BUNDLE_ACTIVE_LOGE("QueryBundleEvents, asyncCallbackInfo == nullptr");
409 }
410 }
411
QueryBundleEventsAsyncCB(napi_env env,napi_status status,void * data)412 void QueryBundleEventsAsyncCB(napi_env env, napi_status status, void *data)
413 {
414 AsyncCallbackInfoStates *asyncCallbackInfo = (AsyncCallbackInfoStates *)data;
415 if (asyncCallbackInfo != nullptr) {
416 napi_value result = nullptr;
417 napi_create_array(env, &result);
418 BundleStateCommon::GetBundleActiveEventForResult(
419 env, asyncCallbackInfo->BundleActiveState, result, true);
420 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
421 }
422 }
423
QueryBundleEvents(napi_env env,napi_callback_info info)424 napi_value QueryBundleEvents(napi_env env, napi_callback_info info)
425 {
426 StatesParamsInfo params;
427 AsyncCallbackInfoStates *asyncCallbackInfo = nullptr;
428 ParseQueryCurrentBundleEventsParameters(env, info, params, asyncCallbackInfo);
429 if (params.errorCode != ERR_OK && !asyncCallbackInfo) {
430 BundleStateCommon::DeleteNapiReference(env, params.callback);
431 return BundleStateCommon::NapiGetNull(env);
432 }
433 napi_value promise = nullptr;
434 std::unique_ptr<AsyncCallbackInfoStates> callbackPtr {asyncCallbackInfo};
435 callbackPtr->beginTime = params.beginTime;
436 BUNDLE_ACTIVE_LOGD("QueryBundleEvents callbackPtr->beginTime: %{public}lld",
437 (long long)callbackPtr->beginTime);
438 callbackPtr->endTime = params.endTime;
439 BUNDLE_ACTIVE_LOGD("QueryBundleEvents callbackPtr->endTime: %{public}lld",
440 (long long)callbackPtr->endTime);
441 BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
442
443 napi_value resourceName = nullptr;
444 NAPI_CALL(env, napi_create_string_latin1(env, "QueryBundleEvents", NAPI_AUTO_LENGTH, &resourceName));
445
446 NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, QueryBundleEventsAsync, QueryBundleEventsAsyncCB,
447 static_cast<void*>(asyncCallbackInfo), &asyncCallbackInfo->asyncWork));
448 NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
449 if (callbackPtr->isCallback) {
450 callbackPtr.release();
451 return BundleStateCommon::NapiGetNull(env);
452 } else {
453 callbackPtr.release();
454 return promise;
455 }
456 }
457
GetBundleStatsInfoByIntervalCallBack(const napi_env & env,napi_value * argv,AppUsageParamsByIntervalInfo & params,size_t argvLen=0)458 napi_value GetBundleStatsInfoByIntervalCallBack(const napi_env &env, napi_value* argv,
459 AppUsageParamsByIntervalInfo ¶ms, size_t argvLen = 0)
460 {
461 if (argvLen <= THIRD_ARG) {
462 params.errorCode = ERR_PARAMETERS_EMPTY;
463 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_EMPTY, "callback");
464 }
465 napi_valuetype valuetype = napi_undefined;
466 NAPI_CALL(env, napi_typeof(env, argv[THIRD_ARG], &valuetype));
467 if (valuetype != napi_function) {
468 params.errorCode = ERR_CALL_BACK_TYPE;
469 return BundleStateCommon::HandleParamErr(env, ERR_CALL_BACK_TYPE, "");
470 }
471 napi_create_reference(env, argv[THIRD_ARG], 1, ¶ms.callback);
472 return BundleStateCommon::NapiGetNull(env);
473 }
474
ParseQueryBundleStatsInfoByInterval(const napi_env & env,const napi_callback_info & info,AppUsageParamsByIntervalInfo & params,AsyncCallbackInfoAppUsageByInterval * & asyncCallbackInfo)475 napi_value ParseQueryBundleStatsInfoByInterval(const napi_env &env, const napi_callback_info &info,
476 AppUsageParamsByIntervalInfo ¶ms, AsyncCallbackInfoAppUsageByInterval*& asyncCallbackInfo)
477 {
478 size_t argc = APP_USAGE_PARAMS_BY_INTERVAL;
479 napi_value argv[APP_USAGE_PARAMS_BY_INTERVAL] = {nullptr};
480 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
481 if ((argc != APP_USAGE_MIN_PARAMS_BY_INTERVAL) && (argc != APP_USAGE_PARAMS_BY_INTERVAL)) {
482 params.errorCode = ERR_PARAMETERS_NUMBER;
483 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_NUMBER, "");
484 }
485 // argv[0] : intervalType
486 if (BundleStateCommon::GetInt32NumberValue(env, argv[0], params.intervalType) == nullptr) {
487 BUNDLE_ACTIVE_LOGE("ParseQueryBundleStatsInfoByInterval failed, intervalType is invalid.");
488 params.errorCode = ERR_INTERVAL_TYPE;
489 return BundleStateCommon::HandleParamErr(env, ERR_INTERVAL_TYPE, "");
490 }
491 if (((params.intervalType < INTERVAL_NUMBER_MIN) || (params.intervalType > INTERVAL_NUMBER_MAX))) {
492 BUNDLE_ACTIVE_LOGE("ParseQueryBundleStatsInfoByInterval failed, intervalType number is invalid.");
493 params.errorCode = ERR_INTERVAL_OUT_OF_RANGE;
494 return BundleStateCommon::HandleParamErr(env, ERR_INTERVAL_OUT_OF_RANGE, "");
495 }
496 // argv[1] : beginTime
497 if (BundleStateCommon::GetInt64NumberValue(env, argv[1], params.beginTime) == nullptr) {
498 BUNDLE_ACTIVE_LOGE("ParseQueryBundleStatsInfoByInterval failed, beginTime type is invalid.");
499 params.errorCode = ERR_BEGIN_TIME_TYPE;
500 return BundleStateCommon::HandleParamErr(env, ERR_BEGIN_TIME_TYPE, "");
501 }
502 if (params.beginTime < TIME_NUMBER_MIN) {
503 BUNDLE_ACTIVE_LOGE("ParseQueryBundleStatsInfoByInterval failed, beginTime value is invalid.");
504 params.errorCode = ERR_BEGIN_TIME_LESS_THEN_ZERO;
505 return BundleStateCommon::HandleParamErr(env, ERR_BEGIN_TIME_LESS_THEN_ZERO, "");
506 }
507 // argv[SECOND_ARG] : endTime
508 if (BundleStateCommon::GetInt64NumberValue(env, argv[SECOND_ARG], params.endTime) == nullptr) {
509 BUNDLE_ACTIVE_LOGE("ParseQueryBundleStatsInfoByInterval failed, endTime type is invalid.");
510 params.errorCode = ERR_END_TIME_TYPE;
511 return BundleStateCommon::HandleParamErr(env, ERR_END_TIME_TYPE, "");
512 }
513 if (params.endTime <= params.beginTime) {
514 BUNDLE_ACTIVE_LOGE("ParseQueryBundleStatsInfoByInterval endTime(%{public}lld) <= beginTime(%{public}lld)",
515 (long long)params.endTime, (long long)params.beginTime);
516 params.errorCode = ERR_END_TIME_LESS_THEN_BEGIN_TIME;
517 return BundleStateCommon::HandleParamErr(env, ERR_END_TIME_LESS_THEN_BEGIN_TIME, "");
518 }
519 // argv[THIRD_ARG]: callback
520 if (argc == APP_USAGE_PARAMS_BY_INTERVAL) {
521 GetBundleStatsInfoByIntervalCallBack(env, argv, params, sizeof(argv));
522 if (params.errorCode != ERR_OK) {
523 return BundleStateCommon::NapiGetNull(env);
524 }
525 }
526 BundleStateCommon::AsyncInit(env, params, asyncCallbackInfo);
527 return BundleStateCommon::NapiGetNull(env);
528 }
529
QueryBundleStatsInfoByIntervalAsync(napi_env env,void * data)530 void QueryBundleStatsInfoByIntervalAsync(napi_env env, void *data)
531 {
532 AsyncCallbackInfoAppUsageByInterval *asyncCallbackInfo = (AsyncCallbackInfoAppUsageByInterval *)data;
533 if (asyncCallbackInfo != nullptr) {
534 asyncCallbackInfo->errorCode =
535 BundleActiveClient::GetInstance().QueryBundleStatsInfoByInterval(asyncCallbackInfo->packageStats,
536 asyncCallbackInfo->intervalType, asyncCallbackInfo->beginTime, asyncCallbackInfo->endTime);
537 } else {
538 BUNDLE_ACTIVE_LOGE("QueryBundleStatsInfoByInterval, asyncCallbackInfo == nullptr");
539 }
540 }
541
QueryBundleStatsInfoByIntervalAsyncCB(napi_env env,napi_status status,void * data)542 void QueryBundleStatsInfoByIntervalAsyncCB(napi_env env, napi_status status, void *data)
543 {
544 AsyncCallbackInfoAppUsageByInterval *asyncCallbackInfo = (AsyncCallbackInfoAppUsageByInterval *)data;
545 if (asyncCallbackInfo != nullptr) {
546 napi_value result = nullptr;
547 napi_create_array(env, &result);
548 BundleStateCommon::GetBundleStateInfoByIntervalForResult(env, asyncCallbackInfo->packageStats, result);
549 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
550 }
551 }
552
QueryBundleStatsInfoByInterval(napi_env env,napi_callback_info info)553 napi_value QueryBundleStatsInfoByInterval(napi_env env, napi_callback_info info)
554 {
555 AppUsageParamsByIntervalInfo params;
556 AsyncCallbackInfoAppUsageByInterval *asyncCallbackInfo = nullptr;
557 ParseQueryBundleStatsInfoByInterval(env, info, params, asyncCallbackInfo);
558 if (params.errorCode != ERR_OK && !asyncCallbackInfo) {
559 BundleStateCommon::DeleteNapiReference(env, params.callback);
560 return BundleStateCommon::NapiGetNull(env);
561 }
562 napi_value promise = nullptr;
563 std::unique_ptr<AsyncCallbackInfoAppUsageByInterval> callbackPtr {asyncCallbackInfo};
564 callbackPtr->intervalType = params.intervalType;
565 callbackPtr->beginTime = params.beginTime;
566 callbackPtr->endTime = params.endTime;
567 BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
568 napi_value resourceName = nullptr;
569 NAPI_CALL(env, napi_create_string_latin1(env, "QueryBundleStatsInfoByInterval", NAPI_AUTO_LENGTH, &resourceName));
570 NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, QueryBundleStatsInfoByIntervalAsync,
571 QueryBundleStatsInfoByIntervalAsyncCB, static_cast<void*>(asyncCallbackInfo), &asyncCallbackInfo->asyncWork));
572 NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
573 if (callbackPtr->isCallback) {
574 callbackPtr.release();
575 return BundleStateCommon::NapiGetNull(env);
576 } else {
577 callbackPtr.release();
578 return promise;
579 }
580 }
581
ParseQueryBundleStatsInfos(const napi_env & env,const napi_callback_info & info,QueryBundleStatsParamsInfo & params,AsyncCallbackInfoAppUsage * & asyncCallbackInfo)582 napi_value ParseQueryBundleStatsInfos(const napi_env &env, const napi_callback_info &info,
583 QueryBundleStatsParamsInfo ¶ms, AsyncCallbackInfoAppUsage*& asyncCallbackInfo)
584 {
585 size_t argc = APP_USAGE_PARAMS;
586 napi_value argv[APP_USAGE_PARAMS] = {nullptr};
587 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
588 if ((argc != APP_USAGE_MIN_PARAMS) && (argc != APP_USAGE_PARAMS)) {
589 params.errorCode = ERR_PARAMETERS_NUMBER;
590 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_NUMBER, "");
591 }
592 // argv[0] : beginTime
593 if (BundleStateCommon::GetInt64NumberValue(env, argv[0], params.beginTime) == nullptr) {
594 BUNDLE_ACTIVE_LOGE("ParseQueryBundleStatsInfos failed, beginTime type is invalid.");
595 params.errorCode = ERR_BEGIN_TIME_TYPE;
596 return BundleStateCommon::HandleParamErr(env, ERR_BEGIN_TIME_TYPE, "");
597 }
598 if (params.beginTime < TIME_NUMBER_MIN) {
599 BUNDLE_ACTIVE_LOGE("ParseQueryBundleStatsInfos failed failed, beginTime value is invalid.");
600 params.errorCode = ERR_BEGIN_TIME_LESS_THEN_ZERO;
601 return BundleStateCommon::HandleParamErr(env, ERR_BEGIN_TIME_LESS_THEN_ZERO, "");
602 }
603 // argv[1] : endTime
604 if (BundleStateCommon::GetInt64NumberValue(env, argv[1], params.endTime) == nullptr) {
605 BUNDLE_ACTIVE_LOGE("ParseQueryBundleStatsInfos failed, endTime type is invalid.");
606 params.errorCode = ERR_END_TIME_TYPE;
607 return BundleStateCommon::HandleParamErr(env, ERR_END_TIME_TYPE, "");
608 }
609 if (params.endTime <= params.beginTime) {
610 BUNDLE_ACTIVE_LOGE("ParseQueryBundleStatsInfos endTime(%{public}lld) <= beginTime(%{public}lld)",
611 (long long)params.endTime, (long long)params.beginTime);
612 params.errorCode = ERR_END_TIME_LESS_THEN_BEGIN_TIME;
613 return BundleStateCommon::HandleParamErr(env, ERR_BEGIN_TIME_LESS_THEN_ZERO, "");
614 }
615 // argv[SECOND_ARG]: callback
616 if (argc == APP_USAGE_PARAMS) {
617 napi_valuetype valuetype = napi_undefined;
618 NAPI_CALL(env, napi_typeof(env, argv[SECOND_ARG], &valuetype));
619 if (valuetype != napi_function) {
620 params.errorCode = ERR_CALL_BACK_TYPE;
621 return BundleStateCommon::HandleParamErr(env, ERR_CALL_BACK_TYPE, "");
622 }
623 napi_create_reference(env, argv[SECOND_ARG], 1, ¶ms.callback);
624 }
625 BundleStateCommon::AsyncInit(env, params, asyncCallbackInfo);
626 return BundleStateCommon::NapiGetNull(env);
627 }
628
QueryBundleStatsInfosAsync(napi_env env,void * data)629 void QueryBundleStatsInfosAsync(napi_env env, void *data)
630 {
631 AsyncCallbackInfoAppUsage *asyncCallbackInfo = (AsyncCallbackInfoAppUsage *)data;
632 if (asyncCallbackInfo != nullptr) {
633 asyncCallbackInfo->packageStats = BundleStateCommon::QueryBundleStatsInfos(asyncCallbackInfo->beginTime,
634 asyncCallbackInfo->endTime, asyncCallbackInfo->errorCode);
635 } else {
636 BUNDLE_ACTIVE_LOGE("queryBundleStatsInfos asyncCallbackInfo == nullptr");
637 }
638 }
639
QueryBundleStatsInfosAsyncCB(napi_env env,napi_status status,void * data)640 void QueryBundleStatsInfosAsyncCB(napi_env env, napi_status status, void *data)
641 {
642 AsyncCallbackInfoAppUsage *asyncCallbackInfo = (AsyncCallbackInfoAppUsage *)data;
643 if (asyncCallbackInfo != nullptr) {
644 napi_value result = nullptr;
645 napi_create_object(env, &result);
646 BundleStateCommon::GetBundleStateInfoForResult(env, asyncCallbackInfo->packageStats, result);
647 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
648 }
649 }
650
QueryBundleStatsInfos(napi_env env,napi_callback_info info)651 napi_value QueryBundleStatsInfos(napi_env env, napi_callback_info info)
652 {
653 QueryBundleStatsParamsInfo params;
654 AsyncCallbackInfoAppUsage *asyncCallbackInfo = nullptr;
655 ParseQueryBundleStatsInfos(env, info, params, asyncCallbackInfo);
656 if (params.errorCode != ERR_OK && !asyncCallbackInfo) {
657 BundleStateCommon::DeleteNapiReference(env, params.callback);
658 return BundleStateCommon::NapiGetNull(env);
659 }
660 napi_value promise = nullptr;
661 std::unique_ptr<AsyncCallbackInfoAppUsage> callbackPtr {asyncCallbackInfo};
662 callbackPtr->beginTime = params.beginTime;
663 BUNDLE_ACTIVE_LOGD("queryBundleStatsInfos callbackPtr->beginTime: %{public}lld",
664 (long long)callbackPtr->beginTime);
665 callbackPtr->endTime = params.endTime;
666 BUNDLE_ACTIVE_LOGD("queryBundleStatsInfos callbackPtr->endTime: %{public}lld",
667 (long long)callbackPtr->endTime);
668 BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
669 napi_value resourceName = nullptr;
670 NAPI_CALL(env, napi_create_string_latin1(env, "queryBundleStatsInfos", NAPI_AUTO_LENGTH, &resourceName));
671 NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, QueryBundleStatsInfosAsync,
672 QueryBundleStatsInfosAsyncCB, static_cast<void*>(asyncCallbackInfo), &asyncCallbackInfo->asyncWork));
673 NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
674 if (callbackPtr->isCallback) {
675 callbackPtr.release();
676 return BundleStateCommon::NapiGetNull(env);
677 } else {
678 callbackPtr.release();
679 return promise;
680 }
681 }
QueryAppStatsInfosAsync(napi_env env,void * data)682 void QueryAppStatsInfosAsync(napi_env env, void *data)
683 {
684 AsyncCallbackInfoAppStats *asyncCallbackInfo = (AsyncCallbackInfoAppStats *)data;
685 if (asyncCallbackInfo != nullptr) {
686 asyncCallbackInfo->appStats = BundleStateCommon::QueryAppStatsInfos(asyncCallbackInfo->beginTime,
687 asyncCallbackInfo->endTime, asyncCallbackInfo->errorCode);
688 } else {
689 BUNDLE_ACTIVE_LOGE("QueryAppStatsInfos asyncCallbackInfo == nullptr");
690 }
691 }
692
QueryAppStatsInfosAsyncCB(napi_env env,napi_status status,void * data)693 void QueryAppStatsInfosAsyncCB(napi_env env, napi_status status, void *data)
694 {
695 AsyncCallbackInfoAppStats *asyncCallbackInfo = (AsyncCallbackInfoAppStats *) data;
696 if (asyncCallbackInfo != nullptr) {
697 napi_value result = nullptr;
698 napi_create_object(env, &result);
699 BundleStateCommon::GetAppStatsInfosForResult(env, asyncCallbackInfo->appStats, result);
700 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
701 }
702 }
703
ParseAppStatsInfos(const napi_env & env,const napi_callback_info & info,QueryBundleStatsParamsInfo & params,AsyncCallbackInfoAppStats * & asyncCallbackInfo)704 napi_value ParseAppStatsInfos(const napi_env &env, const napi_callback_info &info,
705 QueryBundleStatsParamsInfo ¶ms, AsyncCallbackInfoAppStats*& asyncCallbackInfo)
706 {
707 size_t argc = APP_USAGE_PARAMS;
708 napi_value argv[APP_USAGE_PARAMS] = {nullptr};
709 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
710 if ((argc != APP_USAGE_MIN_PARAMS) && (argc != APP_USAGE_PARAMS)) {
711 params.errorCode = ERR_PARAMETERS_NUMBER;
712 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_NUMBER, "");
713 }
714 // argv[0] : beginTime
715 if (BundleStateCommon::GetInt64NumberValue(env, argv[0], params.beginTime) == nullptr) {
716 BUNDLE_ACTIVE_LOGE("ParseAppStatsInfos failed, beginTime type is invalid.");
717 params.errorCode = ERR_BEGIN_TIME_TYPE;
718 return BundleStateCommon::HandleParamErr(env, ERR_BEGIN_TIME_TYPE, "");
719 }
720 if (params.beginTime < TIME_NUMBER_MIN) {
721 BUNDLE_ACTIVE_LOGE("ParseAppStatsInfos failed failed, beginTime value is invalid.");
722 params.errorCode = ERR_BEGIN_TIME_LESS_THEN_ZERO;
723 return BundleStateCommon::HandleParamErr(env, ERR_BEGIN_TIME_LESS_THEN_ZERO, "");
724 }
725 // argv[1] : endTime
726 if (BundleStateCommon::GetInt64NumberValue(env, argv[1], params.endTime) == nullptr) {
727 BUNDLE_ACTIVE_LOGE("ParseAppStatsInfos failed, endTime type is invalid.");
728 params.errorCode = ERR_END_TIME_TYPE;
729 return BundleStateCommon::HandleParamErr(env, ERR_END_TIME_TYPE, "");
730 }
731 if (params.endTime <= params.beginTime) {
732 BUNDLE_ACTIVE_LOGE("ParseAppStatsInfos endTime(%{public}lld) <= beginTime(%{public}lld)",
733 (long long)params.endTime, (long long)params.beginTime);
734 params.errorCode = ERR_END_TIME_LESS_THEN_BEGIN_TIME;
735 return BundleStateCommon::HandleParamErr(env, ERR_BEGIN_TIME_LESS_THEN_ZERO, "");
736 }
737 // argv[SECOND_ARG]: callback
738 if (argc == APP_USAGE_PARAMS) {
739 napi_valuetype valuetype = napi_undefined;
740 NAPI_CALL(env, napi_typeof(env, argv[SECOND_ARG], &valuetype));
741 if (valuetype != napi_function) {
742 params.errorCode = ERR_CALL_BACK_TYPE;
743 return BundleStateCommon::HandleParamErr(env, ERR_CALL_BACK_TYPE, "");
744 }
745 napi_create_reference(env, argv[SECOND_ARG], 1, ¶ms.callback);
746 }
747 BundleStateCommon::AsyncInit(env, params, asyncCallbackInfo);
748 return BundleStateCommon::NapiGetNull(env);
749 }
750
QueryAppStatsInfos(napi_env env,napi_callback_info info)751 napi_value QueryAppStatsInfos(napi_env env, napi_callback_info info)
752 {
753 QueryBundleStatsParamsInfo params;
754 AsyncCallbackInfoAppStats *asyncCallbackInfo = nullptr;
755 ParseAppStatsInfos(env, info, params, asyncCallbackInfo);
756 if (params.errorCode != ERR_OK && !asyncCallbackInfo) {
757 BundleStateCommon::DeleteNapiReference(env, params.callback);
758 return BundleStateCommon::NapiGetNull(env);
759 }
760 napi_value promise = nullptr;
761 std::unique_ptr<AsyncCallbackInfoAppStats> callbackPtr {asyncCallbackInfo};
762 callbackPtr->beginTime = params.beginTime;
763 BUNDLE_ACTIVE_LOGD("QueryAppStatsInfos callbackPtr->beginTime: %{public}lld",
764 (long long)callbackPtr->beginTime);
765 callbackPtr->endTime = params.endTime;
766 BUNDLE_ACTIVE_LOGD("QueryAppStatsInfos callbackPtr->endTime: %{public}lld",
767 (long long)callbackPtr->endTime);
768 BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
769 napi_value resourceName = nullptr;
770 NAPI_CALL(env, napi_create_string_latin1(env, "queryAppStatsInfos", NAPI_AUTO_LENGTH, &resourceName));
771 NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, QueryAppStatsInfosAsync,
772 QueryAppStatsInfosAsyncCB, static_cast<void*>(asyncCallbackInfo), &asyncCallbackInfo->asyncWork));
773 NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
774 if (callbackPtr->isCallback) {
775 callbackPtr.release();
776 return BundleStateCommon::NapiGetNull(env);
777 } else {
778 callbackPtr.release();
779 return promise;
780 }
781 }
782
QueryLastUseTimeAsync(napi_env env,void * data)783 void QueryLastUseTimeAsync(napi_env env, void *data)
784 {
785 AsyncCallbackInfoAppStats *asyncCallbackInfo = (AsyncCallbackInfoAppStats *)data;
786 if (asyncCallbackInfo != nullptr) {
787 asyncCallbackInfo->appStats = BundleStateCommon::QueryLastUseTime(
788 asyncCallbackInfo->queryInfos, asyncCallbackInfo->errorCode);
789 } else {
790 BUNDLE_ACTIVE_LOGE("QueryLastUseTimeAsync asyncCallbackInfo == nullptr");
791 }
792 }
793
QueryLastUseTimeAsyncCB(napi_env env,napi_status status,void * data)794 void QueryLastUseTimeAsyncCB(napi_env env, napi_status status, void *data)
795 {
796 AsyncCallbackInfoAppStats *asyncCallbackInfo = (AsyncCallbackInfoAppStats *)data;
797 if (asyncCallbackInfo != nullptr) {
798 napi_value result = nullptr;
799 napi_create_object(env, &result);
800 BundleStateCommon::GetAppStatsInfosForResult(env, asyncCallbackInfo->appStats, result);
801 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
802 }
803 }
804
ParseLastUseTime(const napi_env & env,const napi_callback_info & info,QueryLastUseTimeParamsInfo & params,AsyncCallbackInfoAppStats * & asyncCallbackInfo)805 napi_value ParseLastUseTime(const napi_env &env, const napi_callback_info &info,
806 QueryLastUseTimeParamsInfo ¶ms, AsyncCallbackInfoAppStats*& asyncCallbackInfo)
807 {
808 size_t argc = APP_USAGE_PARAMS;
809 napi_value argv[APP_USAGE_PARAMS] = {nullptr};
810 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
811 if (argc != 1) {
812 params.errorCode = ERR_PARAMETERS_NUMBER;
813 BUNDLE_ACTIVE_LOGE("ParseLastUseTime failed");
814 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_NUMBER, "");
815 }
816
817 // argv[0] : queryInfos
818 if (BundleStateCommon::ConvertMapFromJs(env, argv[0], params.queryInfos) == nullptr) {
819 BUNDLE_ACTIVE_LOGE("ParseLastUseTime failed, queryInfos type is invalid.");
820 params.errorCode = ERR_BEGIN_TIME_TYPE;
821 return BundleStateCommon::HandleParamErr(env, ERR_BEGIN_TIME_TYPE, "");
822 }
823
824 //argv[SECOND_ARG]: callback
825 if (argc == APP_USAGE_PARAMS) {
826 napi_valuetype valuetype = napi_undefined;
827 NAPI_CALL(env, napi_typeof(env, argv[SECOND_ARG], &valuetype));
828 if (valuetype != napi_function) {
829 params.errorCode = ERR_CALL_BACK_TYPE;
830 return BundleStateCommon::HandleParamErr(env, ERR_CALL_BACK_TYPE, "");
831 }
832 napi_create_reference(env, argv[SECOND_ARG], 1, ¶ms.callback);
833 }
834
835 asyncCallbackInfo = new (std::nothrow) AsyncCallbackInfoAppStats(env);
836 if (!asyncCallbackInfo) {
837 params.errorCode = ERR_ASYNC_CALLBACK_NULLPTR;
838 return BundleStateCommon::HandleParamErr(env, ERR_ASYNC_CALLBACK_NULLPTR, "");
839 }
840 return BundleStateCommon::NapiGetNull(env);
841 }
842
QueryLastUseTime(napi_env env,napi_callback_info info)843 napi_value QueryLastUseTime(napi_env env, napi_callback_info info)
844 {
845 QueryLastUseTimeParamsInfo params;
846 AsyncCallbackInfoAppStats *asyncCallbackInfo = nullptr;
847 ParseLastUseTime(env, info, params, asyncCallbackInfo);
848 if (params.errorCode != ERR_OK && !asyncCallbackInfo) {
849 BUNDLE_ACTIVE_LOGE("QueryLastUseTime failed.");
850 return BundleStateCommon::NapiGetNull(env);
851 }
852 napi_value promise = nullptr;
853 std::unique_ptr<AsyncCallbackInfoAppStats> callbackPtr {asyncCallbackInfo};
854
855 if (callbackPtr == nullptr) {
856 BUNDLE_ACTIVE_LOGE("callbackPtr is null.");
857 return BundleStateCommon::NapiGetNull(env);
858 }
859 callbackPtr->queryInfos = params.queryInfos;
860 BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
861 napi_value resourceName = nullptr;
862 NAPI_CALL(env, napi_create_string_latin1(env, "queryLastUseTime", NAPI_AUTO_LENGTH, &resourceName));
863 NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, QueryLastUseTimeAsync,
864 QueryLastUseTimeAsyncCB, static_cast<void*>(asyncCallbackInfo), &asyncCallbackInfo->asyncWork));
865 NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
866 if (callbackPtr->isCallback) {
867 callbackPtr.release();
868 return BundleStateCommon::NapiGetNull(env);
869 } else {
870 callbackPtr.release();
871 return promise;
872 }
873 }
ParseDeviceEventStates(const napi_env & env,const napi_callback_info & info,EventStatesParamsInfo & params)874 napi_value ParseDeviceEventStates(const napi_env &env, const napi_callback_info &info,
875 EventStatesParamsInfo ¶ms)
876 {
877 size_t argc = EVENT_STATES_PARAMS;
878 napi_value argv[EVENT_STATES_PARAMS] = {nullptr};
879 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
880 if ((argc != EVENT_STATES_MIN_PARAMS) && (argc != EVENT_STATES_PARAMS)) {
881 params.errorCode = ERR_PARAMETERS_NUMBER;
882 return BundleStateCommon::HandleParamErr(env, ERR_PARAMETERS_NUMBER, "");
883 }
884
885 // argv[0] : beginTime
886 if (BundleStateCommon::GetInt64NumberValue(env, argv[0], params.beginTime) == nullptr) {
887 BUNDLE_ACTIVE_LOGE("ParseDeviceEventStates failed, beginTime is invalid.");
888 params.errorCode = ERR_BEGIN_TIME_TYPE;
889 return BundleStateCommon::HandleParamErr(env, ERR_BEGIN_TIME_TYPE, "");
890 }
891 if (params.beginTime < TIME_NUMBER_MIN) {
892 BUNDLE_ACTIVE_LOGE("ParseDeviceEventStates failed, beginTime less then 0.");
893 params.errorCode = ERR_BEGIN_TIME_LESS_THEN_ZERO;
894 return BundleStateCommon::HandleParamErr(env, ERR_BEGIN_TIME_LESS_THEN_ZERO, "");
895 }
896
897 // argv[1] : endTime
898 if (BundleStateCommon::GetInt64NumberValue(env, argv[1], params.endTime) == nullptr) {
899 BUNDLE_ACTIVE_LOGE("ParseDeviceEventStates failed, endTime is invalid.");
900 params.errorCode = ERR_END_TIME_TYPE;
901 return BundleStateCommon::HandleParamErr(env, ERR_END_TIME_TYPE, "");
902 }
903 if (params.endTime <= params.beginTime) {
904 BUNDLE_ACTIVE_LOGE("ParseDeviceEventStates endTime(%{public}lld) <= beginTime(%{public}lld)",
905 (long long)params.endTime, (long long)params.beginTime);
906 params.errorCode = ERR_END_TIME_LESS_THEN_BEGIN_TIME;
907 return BundleStateCommon::HandleParamErr(env, ERR_END_TIME_LESS_THEN_BEGIN_TIME, "");
908 }
909 // argv[SECOND_ARG]: callback
910 if (argc == EVENT_STATES_PARAMS) {
911 napi_valuetype valuetype = napi_undefined;
912 NAPI_CALL(env, napi_typeof(env, argv[SECOND_ARG], &valuetype));
913 if (valuetype != napi_function) {
914 params.errorCode = ERR_CALL_BACK_TYPE;
915 return BundleStateCommon::HandleParamErr(env, ERR_CALL_BACK_TYPE, "");
916 }
917 napi_create_reference(env, argv[SECOND_ARG], 1, ¶ms.callback);
918 }
919 return BundleStateCommon::NapiGetNull(env);
920 }
921
QueryDeviceEventStatsAsync(napi_env env,void * data)922 void QueryDeviceEventStatsAsync(napi_env env, void *data)
923 {
924 AsyncCallbackInfoEventStats *asyncCallbackInfo = (AsyncCallbackInfoEventStats *)data;
925 if (asyncCallbackInfo != nullptr) {
926 asyncCallbackInfo->errorCode = BundleActiveClient::GetInstance()
927 .QueryDeviceEventStats(asyncCallbackInfo->beginTime,
928 asyncCallbackInfo->endTime, asyncCallbackInfo->eventStats);
929 } else {
930 BUNDLE_ACTIVE_LOGE("QueryDeviceEventStats, asyncCallbackInfo == nullptr");
931 }
932 }
933
QueryDeviceEventStatsAsyncCB(napi_env env,napi_status status,void * data)934 void QueryDeviceEventStatsAsyncCB(napi_env env, napi_status status, void *data)
935 {
936 AsyncCallbackInfoEventStats *asyncCallbackInfo = (AsyncCallbackInfoEventStats *)data;
937 if (asyncCallbackInfo != nullptr) {
938 napi_value result = nullptr;
939 napi_create_array(env, &result);
940 BundleStateCommon::GetBundleActiveEventStatsForResult(env, asyncCallbackInfo->eventStats, result);
941 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
942 }
943 }
944
QueryDeviceEventStats(napi_env env,napi_callback_info info)945 napi_value QueryDeviceEventStats(napi_env env, napi_callback_info info)
946 {
947 EventStatesParamsInfo params;
948 ParseDeviceEventStates(env, info, params);
949 if (params.errorCode != ERR_OK) {
950 return BundleStateCommon::NapiGetNull(env);
951 }
952 napi_value promise = nullptr;
953 AsyncCallbackInfoEventStats *asyncCallbackInfo =
954 new (std::nothrow) AsyncCallbackInfoEventStats(env);
955 std::unique_ptr<AsyncCallbackInfoEventStats> callbackPtr =
956 BundleStateCommon::HandleEventStatsInfo(env, asyncCallbackInfo, params);
957 if (!callbackPtr) {
958 return BundleStateCommon::NapiGetNull(env);
959 }
960 BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
961 napi_value resourceName = nullptr;
962 NAPI_CALL(env, napi_create_string_latin1(env, "QueryDeviceEventStats", NAPI_AUTO_LENGTH, &resourceName));
963 NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, QueryDeviceEventStatsAsync,
964 QueryDeviceEventStatsAsyncCB, static_cast<void*>(asyncCallbackInfo), &asyncCallbackInfo->asyncWork));
965 NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
966 if (callbackPtr->isCallback) {
967 callbackPtr.release();
968 return BundleStateCommon::NapiGetNull(env);
969 } else {
970 callbackPtr.release();
971 return promise;
972 }
973 }
974
QueryNotificationEventStatsAsync(napi_env env,void * data)975 void QueryNotificationEventStatsAsync(napi_env env, void *data)
976 {
977 AsyncCallbackInfoEventStats *asyncCallbackInfo = (AsyncCallbackInfoEventStats *)data;
978 if (asyncCallbackInfo != nullptr) {
979 asyncCallbackInfo->errorCode = BundleActiveClient::GetInstance()
980 .QueryNotificationEventStats(asyncCallbackInfo->beginTime,
981 asyncCallbackInfo->endTime, asyncCallbackInfo->eventStats);
982 } else {
983 BUNDLE_ACTIVE_LOGE("QueryNotificationEventStats, asyncCallbackInfo == nullptr");
984 }
985 }
986
QueryNotificationEventStatsAsyncCB(napi_env env,napi_status status,void * data)987 void QueryNotificationEventStatsAsyncCB(napi_env env, napi_status status, void *data)
988 {
989 AsyncCallbackInfoEventStats *asyncCallbackInfo = (AsyncCallbackInfoEventStats *)data;
990 if (asyncCallbackInfo != nullptr) {
991 napi_value result = nullptr;
992 napi_create_array(env, &result);
993 BundleStateCommon::GetBundleActiveNotificationNumberForResult(env,
994 asyncCallbackInfo->eventStats, result);
995 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
996 }
997 }
998
QueryNotificationEventStats(napi_env env,napi_callback_info info)999 napi_value QueryNotificationEventStats(napi_env env, napi_callback_info info)
1000 {
1001 EventStatesParamsInfo params;
1002 ParseDeviceEventStates(env, info, params);
1003 if (params.errorCode != ERR_OK) {
1004 return BundleStateCommon::NapiGetNull(env);
1005 }
1006 napi_value promise = nullptr;
1007 AsyncCallbackInfoEventStats *asyncCallbackInfo =
1008 new (std::nothrow) AsyncCallbackInfoEventStats(env);
1009 std::unique_ptr<AsyncCallbackInfoEventStats> callbackPtr =
1010 BundleStateCommon::HandleEventStatsInfo(env, asyncCallbackInfo, params);
1011 if (!callbackPtr) {
1012 return BundleStateCommon::NapiGetNull(env);
1013 }
1014 BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
1015 napi_value resourceName = nullptr;
1016 NAPI_CALL(env, napi_create_string_latin1(env, "QueryNotificationEventStats", NAPI_AUTO_LENGTH, &resourceName));
1017 NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, QueryNotificationEventStatsAsync,
1018 QueryNotificationEventStatsAsyncCB, static_cast<void*>(asyncCallbackInfo), &asyncCallbackInfo->asyncWork));
1019 NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
1020 if (callbackPtr->isCallback) {
1021 callbackPtr.release();
1022 return BundleStateCommon::NapiGetNull(env);
1023 } else {
1024 callbackPtr.release();
1025 return promise;
1026 }
1027 }
1028 } // namespace DeviceUsageStats
1029 } // namespace OHOS