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 ¶ms)
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, ¶ms.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 ¶ms, 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, ¶ms.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, ¶ms.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 ¶ms)
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, ¶ms.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 ¶ms)
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, ¶ms.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 ¶ms)
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, ¶ms.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