• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &params)
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, &params.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 &params, 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 &params, 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, &params.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 &params)
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 &params, 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, &params.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 &params, 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, &params.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 &params, 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 &params, 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, &params.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 &params, 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, &params.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 &params, 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, &params.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 &params)
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, &params.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