• 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 "app_group_observer_napi.h"
23 #include "bundle_state_inner_errors.h"
24 
25 namespace OHOS {
26 namespace DeviceUsageStats {
27 const uint32_t IS_IDLE_STATE_MIN_PARAMS = 1;
28 const uint32_t IS_IDLE_STATE_PARAMS = 2;
29 const uint32_t PRIORITY_GROUP_MIN_PARAMS = 0;
30 const uint32_t PRIORITY_GROUP_MIDDLE_PARAMS = 1;
31 const uint32_t PRIORITY_GROUP_PARAMS = 2;
32 const uint32_t STATES_MIN_PARAMS = 2;
33 const uint32_t STATES_PARAMS = 3;
34 const uint32_t APP_USAGE_MIN_PARAMS_BY_INTERVAL = 3;
35 const uint32_t APP_USAGE_PARAMS_BY_INTERVAL = 4;
36 const uint32_t APP_USAGE_MIN_PARAMS = 2;
37 const uint32_t APP_USAGE_PARAMS = 3;
38 const uint32_t SECOND_ARG = 2;
39 const uint32_t THIRD_ARG = 3;
40 
ParseIsIdleStateParameters(const napi_env & env,const napi_callback_info & info,IsIdleStateParamsInfo & params)41 napi_value ParseIsIdleStateParameters(const napi_env &env, const napi_callback_info &info,
42     IsIdleStateParamsInfo &params)
43 {
44     size_t argc = IS_IDLE_STATE_PARAMS;
45     napi_value argv[IS_IDLE_STATE_PARAMS] = {nullptr};
46     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
47     NAPI_ASSERT(env, argc == IS_IDLE_STATE_MIN_PARAMS || argc == IS_IDLE_STATE_PARAMS,
48         "Invalid number of parameters");
49 
50     // argv[0] : bundleName
51     std::string result = "";
52     params.bundleName = BundleStateCommon::GetTypeStringValue(env, argv[0], result);
53     if (params.bundleName.empty()) {
54         BUNDLE_ACTIVE_LOGE("ParseIsIdleStateParameters failed, bundleName is empty.");
55         params.errorCode = ERR_USAGE_STATS_BUNDLENAME_EMPTY;
56     }
57     napi_valuetype valuetype;
58     NAPI_CALL(env, napi_typeof(env, argv[0], &valuetype));
59     if ((valuetype != napi_string) && (params.errorCode == ERR_OK)) {
60         BUNDLE_ACTIVE_LOGE("Wrong argument type, string expected.");
61         params.errorCode = ERR_USAGE_STATS_BUNDLENAME_TYPE;
62     }
63 
64     // argv[1]: callback
65     if (argc == IS_IDLE_STATE_PARAMS) {
66         napi_valuetype inputValueType = napi_undefined;
67         NAPI_CALL(env, napi_typeof(env, argv[1], &inputValueType));
68         NAPI_ASSERT(env, inputValueType == napi_function,
69             "ParseIsIdleStateParameters invalid parameter type, function expected.");
70         napi_create_reference(env, argv[1], 1, &params.callback);
71     }
72     return BundleStateCommon::NapiGetNull(env);
73 }
74 
IsIdleState(napi_env env,napi_callback_info info)75 napi_value IsIdleState(napi_env env, napi_callback_info info)
76 {
77     IsIdleStateParamsInfo params;
78     ParseIsIdleStateParameters(env, info, params);
79     if (params.errorCode != ERR_OK) {
80         return BundleStateCommon::JSParaError(env, params.callback, params.errorCode);
81     }
82     napi_value promise = nullptr;
83     AsyncCallbackInfoIsIdleState *asyncCallbackInfo =
84         new (std::nothrow) AsyncCallbackInfoIsIdleState(env);
85     if (!asyncCallbackInfo) {
86         params.errorCode = ERR_USAGE_STATS_ASYNC_CALLBACK_NULLPTR;
87         return BundleStateCommon::JSParaError(env, params.callback, params.errorCode);
88     }
89     if (memset_s(asyncCallbackInfo, sizeof(*asyncCallbackInfo), 0, sizeof(*asyncCallbackInfo)) != EOK) {
90         params.errorCode = ERR_USAGE_STATS_ASYNC_CALLBACK_INIT_FAILED;
91         delete asyncCallbackInfo;
92         asyncCallbackInfo = nullptr;
93         return BundleStateCommon::JSParaError(env, params.callback, params.errorCode);
94     }
95     std::unique_ptr<AsyncCallbackInfoIsIdleState> callbackPtr {asyncCallbackInfo};
96     callbackPtr->bundleName = params.bundleName;
97     BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
98     napi_value resourceName = nullptr;
99     NAPI_CALL(env, napi_create_string_latin1(env, "IsIdleState", NAPI_AUTO_LENGTH, &resourceName));
100     NAPI_CALL(env, napi_create_async_work(env,
101         nullptr,
102         resourceName,
103         [](napi_env env, void *data) {
104             AsyncCallbackInfoIsIdleState *asyncCallbackInfo = (AsyncCallbackInfoIsIdleState *)data;
105             if (asyncCallbackInfo != nullptr) {
106                 asyncCallbackInfo->errorCode = BundleActiveClient::GetInstance().IsBundleIdle(asyncCallbackInfo->state,
107                     asyncCallbackInfo->bundleName);
108             } else {
109                 BUNDLE_ACTIVE_LOGE("IsIdleState, asyncCallbackInfo == nullptr");
110             }
111         },
112         [](napi_env env, napi_status status, void *data) {
113             AsyncCallbackInfoIsIdleState *asyncCallbackInfo = (AsyncCallbackInfoIsIdleState *)data;
114             if (asyncCallbackInfo != nullptr) {
115                 napi_value result = nullptr;
116                 napi_get_boolean(env, asyncCallbackInfo->state, &result);
117                 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
118             }
119         },
120         static_cast<void*>(asyncCallbackInfo),
121         &asyncCallbackInfo->asyncWork));
122     NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
123     if (callbackPtr->isCallback) {
124         callbackPtr.release();
125         return BundleStateCommon::NapiGetNull(env);
126     } else {
127         callbackPtr.release();
128         return promise;
129     }
130 }
131 
ParsePriorityGroupParameters(const napi_env & env,const napi_callback_info & info,QueryAppGroupParamsInfo & params,AsyncQueryAppGroupCallbackInfo * & asyncCallbackInfo)132 napi_value ParsePriorityGroupParameters(const napi_env &env, const napi_callback_info &info,
133     QueryAppGroupParamsInfo &params, AsyncQueryAppGroupCallbackInfo* &asyncCallbackInfo)
134 {
135     size_t argc = PRIORITY_GROUP_PARAMS;
136     napi_value argv[PRIORITY_GROUP_PARAMS] = {nullptr};
137     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
138     NAPI_ASSERT(env, argc == PRIORITY_GROUP_MIN_PARAMS || argc == PRIORITY_GROUP_MIDDLE_PARAMS ||
139         argc == PRIORITY_GROUP_PARAMS, "Invalid number of parameters");
140     std::string result = "";
141     params.bundleName = "";
142     if (argc == PRIORITY_GROUP_MIDDLE_PARAMS) {
143         napi_valuetype valuetype = napi_undefined;
144         NAPI_CALL(env, napi_typeof(env, argv[0], &valuetype));
145         if (valuetype == napi_function) {
146             napi_create_reference(env, argv[0], 1, &params.callback);
147         } else {
148             params.bundleName = BundleStateCommon::GetTypeStringValue(env, argv[0], result);
149             if (params.bundleName.empty()) {
150                 BUNDLE_ACTIVE_LOGE("ParsePriorityGroupParameters failed, bundleName is empty.");
151                 params.errorCode = ERR_USAGE_STATS_BUNDLENAME_EMPTY;
152             }
153         }
154     } else if (argc == PRIORITY_GROUP_PARAMS) {
155         // argv[0] : bundleName
156         params.bundleName = BundleStateCommon::GetTypeStringValue(env, argv[0], result);
157         if (params.bundleName.empty()) {
158             BUNDLE_ACTIVE_LOGE("ParsePriorityGroupParameters failed, bundleName is empty.");
159             params.errorCode = ERR_USAGE_STATS_BUNDLENAME_EMPTY;
160         }
161 
162         // argv[1]: callback
163         napi_valuetype valuetype = napi_undefined;
164         NAPI_CALL(env, napi_typeof(env, argv[1], &valuetype));
165         NAPI_ASSERT(env, valuetype == napi_function, "ParsePriorityGroupParameters invalid parameter type. "
166             "Function expected.");
167         napi_create_reference(env, argv[1], 1, &params.callback);
168     }
169     BundleStateCommon::AsyncInit(env, params, asyncCallbackInfo);
170     return BundleStateCommon::NapiGetNull(env);
171 }
172 
QueryAppUsagePriorityGroup(napi_env env,napi_callback_info info)173 napi_value QueryAppUsagePriorityGroup(napi_env env, napi_callback_info info)
174 {
175     QueryAppGroupParamsInfo params;
176     AsyncQueryAppGroupCallbackInfo *asyncCallbackInfo = nullptr;
177     ParsePriorityGroupParameters(env, info, params, asyncCallbackInfo);
178     if (params.errorCode != ERR_OK && !asyncCallbackInfo) {
179         return BundleStateCommon::JSParaError(env, params.callback, params.errorCode);
180     }
181     std::unique_ptr<AsyncQueryAppGroupCallbackInfo> callbackPtr {asyncCallbackInfo};
182     callbackPtr->bundleName = params.bundleName;
183     BUNDLE_ACTIVE_LOGD("QueryAppUsagePriorityGroup callbackPtr->bundleName: %{public}s",
184         callbackPtr->bundleName.c_str());
185     napi_value promise = nullptr;
186     BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
187     napi_value resourceName = nullptr;
188     NAPI_CALL(env, napi_create_string_latin1(env, "QueryAppUsagePriorityGroup", NAPI_AUTO_LENGTH, &resourceName));
189     NAPI_CALL(env, napi_create_async_work(env,
190         nullptr,
191         resourceName,
192         [](napi_env env, void *data) {
193             AsyncQueryAppGroupCallbackInfo *asyncCallbackInfo = (AsyncQueryAppGroupCallbackInfo *)data;
194             if (asyncCallbackInfo) {
195                 asyncCallbackInfo->errorCode = BundleActiveClient::GetInstance().QueryAppGroup(
196                     asyncCallbackInfo->priorityGroup, asyncCallbackInfo->bundleName);
197             } else {
198                 BUNDLE_ACTIVE_LOGE("QueryAppUsagePriorityGroup, asyncCallbackInfo == nullptr");
199             }
200         },
201         [](napi_env env, napi_status status, void *data) {
202             AsyncQueryAppGroupCallbackInfo *asyncCallbackInfo = (AsyncQueryAppGroupCallbackInfo *)data;
203             if (asyncCallbackInfo) {
204                 if (asyncCallbackInfo->priorityGroup == -1) {
205                     asyncCallbackInfo->errorCode = ERR_SERVICE_FAILED;
206                 }
207                 napi_value result = nullptr;
208                 napi_create_int32(env, asyncCallbackInfo->priorityGroup, &result);
209                 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
210             }
211         },
212         static_cast<void*>(asyncCallbackInfo),
213         &asyncCallbackInfo->asyncWork));
214     NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
215     if (callbackPtr->isCallback) {
216         callbackPtr.release();
217         return BundleStateCommon::NapiGetNull(env);
218     } else {
219         callbackPtr.release();
220         return promise;
221     }
222 }
223 
ParseStatesParameters(const napi_env & env,const napi_callback_info & info,StatesParamsInfo & params)224 napi_value ParseStatesParameters(const napi_env &env, const napi_callback_info &info, StatesParamsInfo &params)
225 {
226     size_t argc = STATES_PARAMS;
227     napi_value argv[STATES_PARAMS] = {nullptr};
228     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
229     NAPI_ASSERT(env, argc == STATES_MIN_PARAMS || argc == STATES_PARAMS,
230         "Invalid number of parameters");
231 
232     // argv[0] : beginTime
233     if (BundleStateCommon::GetInt64NumberValue(env, argv[0], params.beginTime) == nullptr) {
234         BUNDLE_ACTIVE_LOGE("ParseStatesParameters failed, beginTime type is invalid.");
235         params.errorCode = ERR_USAGE_STATS_BEGIN_TIME_INVALID;
236     }
237     if ((params.errorCode == ERR_OK)
238         && (params.beginTime < TIME_NUMBER_MIN)) {
239         BUNDLE_ACTIVE_LOGE("ParseStatesParameters failed, beginTime value is invalid.");
240         params.errorCode = ERR_USAGE_STATS_BEGIN_TIME_INVALID;
241     }
242 
243     // argv[1] : endTime
244     if ((params.errorCode == ERR_OK)
245         && (BundleStateCommon::GetInt64NumberValue(env, argv[1], params.endTime) == nullptr)) {
246         BUNDLE_ACTIVE_LOGE("ParseStatesParameters failed, endTime type is invalid.");
247         params.errorCode = ERR_USAGE_STATS_END_TIME_INVALID;
248     }
249     if ((params.errorCode == ERR_OK)
250         && (params.endTime < TIME_NUMBER_MIN)) {
251         BUNDLE_ACTIVE_LOGE("ParseStatesParameters failed, endTime value is invalid.");
252         params.errorCode = ERR_USAGE_STATS_END_TIME_INVALID;
253     }
254     if ((params.errorCode == ERR_OK) && (params.endTime <= params.beginTime)) {
255         BUNDLE_ACTIVE_LOGE("ParseStatesParameters endTime(%{public}lld) <= beginTime(%{public}lld)",
256             (long long)params.endTime, (long long)params.beginTime);
257         params.errorCode = ERR_USAGE_STATS_TIME_INTERVAL;
258     }
259 
260     // argv[SECOND_ARG]: callback
261     if (argc == STATES_PARAMS) {
262         napi_valuetype valuetype = napi_undefined;
263         NAPI_CALL(env, napi_typeof(env, argv[SECOND_ARG], &valuetype));
264         NAPI_ASSERT(env, valuetype == napi_function, "ParseStatesParameters invalid parameter type. "
265             "Function expected.");
266         napi_create_reference(env, argv[SECOND_ARG], 1, &params.callback);
267     }
268     return BundleStateCommon::NapiGetNull(env);
269 }
270 
QueryCurrentBundleActiveStates(napi_env env,napi_callback_info info)271 napi_value QueryCurrentBundleActiveStates(napi_env env, napi_callback_info info)
272 {
273     StatesParamsInfo params;
274     ParseStatesParameters(env, info, params);
275     if (params.errorCode != ERR_OK) {
276         return BundleStateCommon::JSParaError(env, params.callback, params.errorCode);
277     }
278     napi_value promise = nullptr;
279     AsyncCallbackInfoStates *asyncCallbackInfo =
280         new (std::nothrow) AsyncCallbackInfoStates(env);
281     if (!asyncCallbackInfo) {
282         params.errorCode = ERR_USAGE_STATS_ASYNC_CALLBACK_NULLPTR;
283         return BundleStateCommon::JSParaError(env, params.callback, params.errorCode);
284     }
285     if (memset_s(asyncCallbackInfo, sizeof(*asyncCallbackInfo), 0, sizeof(*asyncCallbackInfo)) != EOK) {
286         params.errorCode = ERR_USAGE_STATS_ASYNC_CALLBACK_INIT_FAILED;
287         delete asyncCallbackInfo;
288         asyncCallbackInfo = nullptr;
289         return BundleStateCommon::JSParaError(env, params.callback, params.errorCode);
290     }
291     std::unique_ptr<AsyncCallbackInfoStates> callbackPtr {asyncCallbackInfo};
292     callbackPtr->beginTime = params.beginTime;
293     BUNDLE_ACTIVE_LOGD("QueryCurrentBundleActiveStates callbackPtr->beginTime: %{public}lld",
294         (long long)callbackPtr->beginTime);
295     callbackPtr->endTime = params.endTime;
296     BUNDLE_ACTIVE_LOGD("QueryCurrentBundleActiveStates callbackPtr->endTime: %{public}lld",
297         (long long)callbackPtr->endTime);
298     BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
299 
300     napi_value resourceName = nullptr;
301     NAPI_CALL(env, napi_create_string_latin1(env, "QueryCurrentBundleActiveStates", NAPI_AUTO_LENGTH, &resourceName));
302     NAPI_CALL(env, napi_create_async_work(env,
303         nullptr,
304         resourceName,
305         [](napi_env env, void *data) {
306             AsyncCallbackInfoStates *asyncCallbackInfo = (AsyncCallbackInfoStates *)data;
307             if (asyncCallbackInfo != nullptr) {
308                 asyncCallbackInfo->errorCode =
309                     BundleActiveClient::GetInstance().QueryCurrentBundleEvents(asyncCallbackInfo->BundleActiveState,
310                         asyncCallbackInfo->beginTime, asyncCallbackInfo->endTime);
311             } else {
312                 BUNDLE_ACTIVE_LOGE("QueryCurrentBundleActiveStates, asyncCallbackInfo == nullptr");
313             }
314         },
315         [](napi_env env, napi_status status, void *data) {
316             AsyncCallbackInfoStates *asyncCallbackInfo = (AsyncCallbackInfoStates *)data;
317             if (asyncCallbackInfo != nullptr) {
318                 napi_value result = nullptr;
319                 napi_create_array(env, &result);
320                 BundleStateCommon::GetBundleActiveEventForResult(
321                     env, asyncCallbackInfo->BundleActiveState, result, false);
322                 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
323             }
324         },
325         static_cast<void*>(asyncCallbackInfo),
326         &asyncCallbackInfo->asyncWork));
327     NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
328     if (callbackPtr->isCallback) {
329         callbackPtr.release();
330         return BundleStateCommon::NapiGetNull(env);
331     } else {
332         callbackPtr.release();
333         return promise;
334     }
335 }
336 
QueryBundleActiveStates(napi_env env,napi_callback_info info)337 napi_value QueryBundleActiveStates(napi_env env, napi_callback_info info)
338 {
339     StatesParamsInfo params;
340     ParseStatesParameters(env, info, params);
341     if (params.errorCode != ERR_OK) {
342         return BundleStateCommon::JSParaError(env, params.callback, params.errorCode);
343     }
344     napi_value promise = nullptr;
345     AsyncCallbackInfoStates *asyncCallbackInfo =
346         new (std::nothrow) AsyncCallbackInfoStates(env);
347     if (!asyncCallbackInfo) {
348         params.errorCode = ERR_USAGE_STATS_ASYNC_CALLBACK_NULLPTR;
349         return BundleStateCommon::JSParaError(env, params.callback, params.errorCode);
350     }
351     if (memset_s(asyncCallbackInfo, sizeof(*asyncCallbackInfo), 0, sizeof(*asyncCallbackInfo)) != EOK) {
352         params.errorCode = ERR_USAGE_STATS_ASYNC_CALLBACK_INIT_FAILED;
353         delete asyncCallbackInfo;
354         asyncCallbackInfo = nullptr;
355         return BundleStateCommon::JSParaError(env, params.callback, params.errorCode);
356     }
357     std::unique_ptr<AsyncCallbackInfoStates> callbackPtr {asyncCallbackInfo};
358     callbackPtr->beginTime = params.beginTime;
359     BUNDLE_ACTIVE_LOGD("QueryBundleActiveStates callbackPtr->beginTime: %{public}lld",
360         (long long)callbackPtr->beginTime);
361     callbackPtr->endTime = params.endTime;
362     BUNDLE_ACTIVE_LOGD("QueryBundleActiveStates callbackPtr->endTime: %{public}lld",
363         (long long)callbackPtr->endTime);
364     BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
365 
366     napi_value resourceName = nullptr;
367     NAPI_CALL(env, napi_create_string_latin1(env, "QueryBundleActiveStates", NAPI_AUTO_LENGTH, &resourceName));
368 
369     NAPI_CALL(env, napi_create_async_work(env,
370         nullptr,
371         resourceName,
372         [](napi_env env, void *data) {
373             AsyncCallbackInfoStates *asyncCallbackInfo = (AsyncCallbackInfoStates *)data;
374             if (asyncCallbackInfo != nullptr) {
375                 asyncCallbackInfo->errorCode =
376                     BundleActiveClient::GetInstance().QueryBundleEvents(asyncCallbackInfo->BundleActiveState,
377                         asyncCallbackInfo->beginTime, asyncCallbackInfo->endTime, asyncCallbackInfo->errorCode);
378             } else {
379                 BUNDLE_ACTIVE_LOGE("QueryBundleActiveStates, asyncCallbackInfo == nullptr");
380             }
381         },
382         [](napi_env env, napi_status status, void *data) {
383             AsyncCallbackInfoStates *asyncCallbackInfo = (AsyncCallbackInfoStates *)data;
384             if (asyncCallbackInfo != nullptr) {
385                 napi_value result = nullptr;
386                 napi_create_array(env, &result);
387                 BundleStateCommon::GetBundleActiveEventForResult(
388                     env, asyncCallbackInfo->BundleActiveState, result, false);
389                 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
390             }
391         },
392         static_cast<void*>(asyncCallbackInfo),
393         &asyncCallbackInfo->asyncWork));
394     NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
395     if (callbackPtr->isCallback) {
396         callbackPtr.release();
397         return BundleStateCommon::NapiGetNull(env);
398     } else {
399         callbackPtr.release();
400         return promise;
401     }
402 }
403 
ParseAppUsageParametersByInterval(const napi_env & env,const napi_callback_info & info,AppUsageParamsByIntervalInfo & params)404 napi_value ParseAppUsageParametersByInterval(const napi_env &env, const napi_callback_info &info,
405     AppUsageParamsByIntervalInfo &params)
406 {
407     size_t argc = APP_USAGE_PARAMS_BY_INTERVAL;
408     napi_value argv[APP_USAGE_PARAMS_BY_INTERVAL] = {nullptr};
409     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
410     NAPI_ASSERT(env, argc == APP_USAGE_MIN_PARAMS_BY_INTERVAL || argc == APP_USAGE_PARAMS_BY_INTERVAL,
411         "Invalid number of parameters");
412 
413     // argv[0] : intervalType
414     if (BundleStateCommon::GetInt32NumberValue(env, argv[0], params.intervalType) == nullptr) {
415         BUNDLE_ACTIVE_LOGE("ParseAppUsageParametersByInterval failed, intervalType is invalid.");
416         params.errorCode = ERR_USAGE_STATS_INTERVAL_TYPE;
417     }
418     if ((params.errorCode == ERR_OK) && ((params.intervalType < INTERVAL_NUMBER_MIN)
419         || (params.intervalType > INTERVAL_NUMBER_MAX))) {
420         BUNDLE_ACTIVE_LOGE("ParseAppUsageParametersByInterval failed, intervalType number is invalid.");
421         params.errorCode = ERR_USAGE_STATS_INTERVAL_NUMBER;
422     }
423 
424     // argv[1] : beginTime
425     if ((params.errorCode == ERR_OK)
426         && (BundleStateCommon::GetInt64NumberValue(env, argv[1], params.beginTime) == nullptr)) {
427         BUNDLE_ACTIVE_LOGE("ParseAppUsageParametersByInterval failed, beginTime type is invalid.");
428         params.errorCode = ERR_USAGE_STATS_BEGIN_TIME_INVALID;
429     }
430     if ((params.errorCode == ERR_OK)
431         && (params.beginTime < TIME_NUMBER_MIN)) {
432         BUNDLE_ACTIVE_LOGE("ParseAppUsageParametersByInterval failed, beginTime value is invalid.");
433         params.errorCode = ERR_USAGE_STATS_BEGIN_TIME_INVALID;
434     }
435 
436     // argv[SECOND_ARG] : endTime
437     if ((params.errorCode == ERR_OK)
438         && (BundleStateCommon::GetInt64NumberValue(env, argv[SECOND_ARG], params.endTime) == nullptr)) {
439         BUNDLE_ACTIVE_LOGE("ParseAppUsageParametersByInterval failed, endTime type is invalid.");
440         params.errorCode = ERR_USAGE_STATS_END_TIME_INVALID;
441     }
442     if ((params.errorCode == ERR_OK)
443         && (params.endTime < TIME_NUMBER_MIN)) {
444         BUNDLE_ACTIVE_LOGE("ParseAppUsageParametersByInterval failed, endTime value is invalid.");
445         params.errorCode = ERR_USAGE_STATS_END_TIME_INVALID;
446     }
447     if ((params.errorCode == ERR_OK) && (params.endTime <= params.beginTime)) {
448         BUNDLE_ACTIVE_LOGE("ParseAppUsageParametersByInterval endTime(%{public}lld) <= beginTime(%{public}lld)",
449             (long long)params.endTime, (long long)params.beginTime);
450         params.errorCode = ERR_USAGE_STATS_TIME_INTERVAL;
451     }
452 
453     // argv[THIRD_ARG]: callback
454     if (argc == APP_USAGE_PARAMS_BY_INTERVAL) {
455         napi_valuetype valuetype = napi_undefined;
456         NAPI_CALL(env, napi_typeof(env, argv[THIRD_ARG], &valuetype));
457         NAPI_ASSERT(env, valuetype == napi_function, "ParseAppUsageParametersByInterval invalid parameter type. "
458             "Function expected.");
459         napi_create_reference(env, argv[THIRD_ARG], 1, &params.callback);
460     }
461     return BundleStateCommon::NapiGetNull(env);
462 }
463 
QueryBundleStateInfoByInterval(napi_env env,napi_callback_info info)464 napi_value QueryBundleStateInfoByInterval(napi_env env, napi_callback_info info)
465 {
466     AppUsageParamsByIntervalInfo params;
467     ParseAppUsageParametersByInterval(env, info, params);
468     if (params.errorCode != ERR_OK) {
469         return BundleStateCommon::JSParaError(env, params.callback, params.errorCode);
470     }
471     napi_value promise = nullptr;
472     AsyncCallbackInfoAppUsageByInterval *asyncCallbackInfo =
473         new (std::nothrow) AsyncCallbackInfoAppUsageByInterval(env);
474     if (!asyncCallbackInfo) {
475         params.errorCode = ERR_USAGE_STATS_ASYNC_CALLBACK_NULLPTR;
476         return BundleStateCommon::JSParaError(env, params.callback, params.errorCode);
477     }
478     if (memset_s(asyncCallbackInfo, sizeof(*asyncCallbackInfo), 0, sizeof(*asyncCallbackInfo)) != EOK) {
479         params.errorCode = ERR_USAGE_STATS_ASYNC_CALLBACK_INIT_FAILED;
480         delete asyncCallbackInfo;
481         asyncCallbackInfo = nullptr;
482         return BundleStateCommon::JSParaError(env, params.callback, params.errorCode);
483     }
484     std::unique_ptr<AsyncCallbackInfoAppUsageByInterval> callbackPtr {asyncCallbackInfo};
485     callbackPtr->intervalType = params.intervalType;
486     BUNDLE_ACTIVE_LOGD("QueryBundleStateInfoByInterval callbackPtr->intervalType: %{public}d",
487         callbackPtr->intervalType);
488     callbackPtr->beginTime = params.beginTime;
489     BUNDLE_ACTIVE_LOGD("QueryBundleStateInfoByInterval callbackPtr->beginTime: %{public}lld",
490         (long long)callbackPtr->beginTime);
491     callbackPtr->endTime = params.endTime;
492     BUNDLE_ACTIVE_LOGD("QueryBundleStateInfoByInterval callbackPtr->endTime: %{public}lld",
493         (long long)callbackPtr->endTime);
494     BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
495     napi_value resourceName = nullptr;
496     NAPI_CALL(env, napi_create_string_latin1(env, "QueryBundleStateInfoByInterval", NAPI_AUTO_LENGTH, &resourceName));
497     NAPI_CALL(env, napi_create_async_work(env,
498         nullptr,
499         resourceName,
500         [](napi_env env, void *data) {
501             AsyncCallbackInfoAppUsageByInterval *asyncCallbackInfo = (AsyncCallbackInfoAppUsageByInterval *)data;
502             if (asyncCallbackInfo != nullptr) {
503                 asyncCallbackInfo->errorCode =
504                     BundleActiveClient::GetInstance().QueryBundleStatsInfoByInterval(asyncCallbackInfo->packageStats,
505                         asyncCallbackInfo->intervalType, asyncCallbackInfo->beginTime, asyncCallbackInfo->endTime);
506             } else {
507                 BUNDLE_ACTIVE_LOGE("QueryBundleStateInfoByInterval, asyncCallbackInfo == nullptr");
508             }
509         },
510         [](napi_env env, napi_status status, void *data) {
511             AsyncCallbackInfoAppUsageByInterval *asyncCallbackInfo = (AsyncCallbackInfoAppUsageByInterval *)data;
512             if (asyncCallbackInfo != nullptr) {
513                 napi_value result = nullptr;
514                 napi_create_array(env, &result);
515                 BundleStateCommon::GetBundleStateInfoByIntervalForResult(env, asyncCallbackInfo->packageStats, result);
516                 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
517             }
518         },
519         static_cast<void*>(asyncCallbackInfo),
520         &asyncCallbackInfo->asyncWork));
521     NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
522     if (callbackPtr->isCallback) {
523         callbackPtr.release();
524         return BundleStateCommon::NapiGetNull(env);
525     } else {
526         callbackPtr.release();
527         return promise;
528     }
529 }
530 
ParseAppUsageParameters(const napi_env & env,const napi_callback_info & info,QueryBundleStatsParamsInfo & params)531 napi_value ParseAppUsageParameters(const napi_env &env, const napi_callback_info &info,
532     QueryBundleStatsParamsInfo &params)
533 {
534     size_t argc = APP_USAGE_PARAMS;
535     napi_value argv[APP_USAGE_PARAMS] = {nullptr};
536     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
537     NAPI_ASSERT(env, argc == APP_USAGE_MIN_PARAMS || argc == APP_USAGE_PARAMS,
538         "Invalid number of parameters");
539 
540     // argv[0] : beginTime
541     if (BundleStateCommon::GetInt64NumberValue(env, argv[0], params.beginTime) == nullptr) {
542         BUNDLE_ACTIVE_LOGE("ParseAppUsageParameters failed, beginTime type is invalid.");
543         params.errorCode = ERR_USAGE_STATS_BEGIN_TIME_INVALID;
544     }
545     if ((params.errorCode == ERR_OK) && (params.beginTime < TIME_NUMBER_MIN)) {
546         BUNDLE_ACTIVE_LOGE("ParseAppUsageParameters failed failed, beginTime value is invalid.");
547         params.errorCode = ERR_USAGE_STATS_BEGIN_TIME_INVALID;
548     }
549 
550     // argv[1] : endTime
551     if ((params.errorCode == ERR_OK)
552         && (BundleStateCommon::GetInt64NumberValue(env, argv[1], params.endTime) == nullptr)) {
553         BUNDLE_ACTIVE_LOGE("ParseAppUsageParameters failed, endTime type is invalid.");
554         params.errorCode = ERR_USAGE_STATS_END_TIME_INVALID;
555     }
556     if ((params.errorCode == ERR_OK) && (params.endTime < TIME_NUMBER_MIN)) {
557         BUNDLE_ACTIVE_LOGE("ParseAppUsageParameters failed failed, endTime value is invalid.");
558         params.errorCode = ERR_USAGE_STATS_END_TIME_INVALID;
559     }
560     if ((params.errorCode == ERR_OK) && (params.endTime <= params.beginTime)) {
561         BUNDLE_ACTIVE_LOGE("ParseAppUsageParameters endTime(%{public}lld) <= beginTime(%{public}lld)",
562             (long long)params.endTime, (long long)params.beginTime);
563         params.errorCode = ERR_USAGE_STATS_TIME_INTERVAL;
564     }
565 
566     // argv[SECOND_ARG]: callback
567     if (argc == APP_USAGE_PARAMS) {
568         napi_valuetype valuetype = napi_undefined;
569         NAPI_CALL(env, napi_typeof(env, argv[SECOND_ARG], &valuetype));
570         NAPI_ASSERT(env, valuetype == napi_function, "ParseAppUsageParameters invalid parameter type. "
571             "Function expected.");
572         napi_create_reference(env, argv[SECOND_ARG], 1, &params.callback);
573     }
574     return BundleStateCommon::NapiGetNull(env);
575 }
576 
QueryBundleStateInfos(napi_env env,napi_callback_info info)577 napi_value QueryBundleStateInfos(napi_env env, napi_callback_info info)
578 {
579     QueryBundleStatsParamsInfo params;
580     ParseAppUsageParameters(env, info, params);
581     if (params.errorCode != ERR_OK) {
582         return BundleStateCommon::JSParaError(env, params.callback, params.errorCode);
583     }
584     napi_value promise = nullptr;
585     AsyncCallbackInfoAppUsage *asyncCallbackInfo =
586         new (std::nothrow) AsyncCallbackInfoAppUsage(env);
587     if (!asyncCallbackInfo) {
588         params.errorCode = ERR_USAGE_STATS_ASYNC_CALLBACK_NULLPTR;
589         return BundleStateCommon::JSParaError(env, params.callback, params.errorCode);
590     }
591     if (memset_s(asyncCallbackInfo, sizeof(*asyncCallbackInfo), 0, sizeof(*asyncCallbackInfo)) != EOK) {
592         params.errorCode = ERR_USAGE_STATS_ASYNC_CALLBACK_INIT_FAILED;
593         delete asyncCallbackInfo;
594         asyncCallbackInfo = nullptr;
595         return BundleStateCommon::JSParaError(env, params.callback, params.errorCode);
596     }
597     std::unique_ptr<AsyncCallbackInfoAppUsage> callbackPtr {asyncCallbackInfo};
598     callbackPtr->beginTime = params.beginTime;
599     BUNDLE_ACTIVE_LOGD("QueryBundleStateInfos callbackPtr->beginTime: %{public}lld",
600         (long long)callbackPtr->beginTime);
601     callbackPtr->endTime = params.endTime;
602     BUNDLE_ACTIVE_LOGD("QueryBundleStateInfos callbackPtr->endTime: %{public}lld",
603         (long long)callbackPtr->endTime);
604     BundleStateCommon::SettingAsyncWorkData(env, params.callback, *asyncCallbackInfo, promise);
605     napi_value resourceName = nullptr;
606     NAPI_CALL(env, napi_create_string_latin1(env, "QueryBundleStateInfos", NAPI_AUTO_LENGTH, &resourceName));
607     NAPI_CALL(env, napi_create_async_work(env,
608         nullptr,
609         resourceName,
610         [](napi_env env, void *data) {
611             AsyncCallbackInfoAppUsage *asyncCallbackInfo = (AsyncCallbackInfoAppUsage *)data;
612             if (asyncCallbackInfo != nullptr) {
613                 asyncCallbackInfo->packageStats = BundleStateCommon::QueryBundleStatsInfos(asyncCallbackInfo->beginTime,
614                     asyncCallbackInfo->endTime, asyncCallbackInfo->errorCode);
615             } else {
616                 BUNDLE_ACTIVE_LOGE("QueryBundleStateInfos asyncCallbackInfo == nullptr");
617             }
618         },
619         [](napi_env env, napi_status status, void *data) {
620             AsyncCallbackInfoAppUsage *asyncCallbackInfo = (AsyncCallbackInfoAppUsage *)data;
621             if (asyncCallbackInfo != nullptr) {
622                 napi_value result = nullptr;
623                 napi_create_object(env, &result);
624                 BundleStateCommon::GetBundleStateInfoForResult(env, asyncCallbackInfo->packageStats, result);
625                 BundleStateCommon::GetCallbackPromiseResult(env, *asyncCallbackInfo, result);
626             }
627         },
628         static_cast<void*>(asyncCallbackInfo),
629         &asyncCallbackInfo->asyncWork));
630     NAPI_CALL(env, napi_queue_async_work(env, callbackPtr->asyncWork));
631     if (callbackPtr->isCallback) {
632         callbackPtr.release();
633         return BundleStateCommon::NapiGetNull(env);
634     } else {
635         callbackPtr.release();
636         return promise;
637     }
638 }
639 }  // namespace DeviceUsageStats
640 }  // namespace OHOS
641 
642