1 /*
2 * Copyright (c) 2021 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 "storage_statistics_n_exporter.h"
17
18 #include <tuple>
19 #include <singleton.h>
20
21 #include "n_async/n_async_work_callback.h"
22 #include "n_async/n_async_work_promise.h"
23 #include "n_class.h"
24 #include "n_error.h"
25 #include "n_func_arg.h"
26 #include "n_val.h"
27 #include "storage_manager_connect.h"
28 #include "storage_service_errno.h"
29 #include "storage_service_log.h"
30 #include "storage_statistics_napi.h"
31
32 using namespace OHOS::FileManagement::LibN;
33
34 namespace OHOS {
35 namespace StorageManager {
36 const std::string EMPTY_STRING = "";
37 constexpr int32_t INVALID_INDEX = -1;
38 constexpr int32_t INVALID_STATFLAG = -1;
39
GetTotalSizeOfVolume(napi_env env,napi_callback_info info)40 napi_value GetTotalSizeOfVolume(napi_env env, napi_callback_info info)
41 {
42 if (!IsSystemApp()) {
43 NError(E_PERMISSION_SYS).ThrowErr(env);
44 return nullptr;
45 }
46 NFuncArg funcArg(env, info);
47 if (!funcArg.InitArgs((int)NARG_CNT::ONE, (int)NARG_CNT::TWO)) {
48 NError(E_PARAMS).ThrowErr(env);
49 return nullptr;
50 }
51
52 bool succ = false;
53 std::unique_ptr<char []> uuid;
54 tie(succ, uuid, std::ignore) = NVal(env, funcArg[(int)NARG_POS::FIRST]).ToUTF8String();
55 if (!succ) {
56 NError(E_PARAMS).ThrowErr(env);
57 return nullptr;
58 }
59
60 auto resultSize = std::make_shared<int64_t>();
61 std::string uuidString(uuid.get());
62 auto cbExec = [uuidString, resultSize]() -> NError {
63 int32_t errNum = DelayedSingleton<StorageManagerConnect>::GetInstance()->GetTotalSizeOfVolume(uuidString,
64 *resultSize);
65 if (errNum != E_OK) {
66 return NError(Convert2JsErrNum(errNum));
67 }
68 return NError(ERRNO_NOERR);
69 };
70
71 auto cbComplete = [resultSize](napi_env env, NError err) -> NVal {
72 if (err) {
73 return { env, err.GetNapiErr(env) };
74 }
75 return NVal::CreateInt64(env, *resultSize);
76 };
77
78 std::string procedureName = "GetTotalSizeOfVolume";
79 NVal thisVar(env, funcArg.GetThisVar());
80 if (funcArg.GetArgc() == (uint)NARG_CNT::ONE) {
81 return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_;
82 } else {
83 NVal cb(env, funcArg[(int)NARG_POS::SECOND]);
84 return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_;
85 }
86 }
87
88
GetFreeSizeOfVolume(napi_env env,napi_callback_info info)89 napi_value GetFreeSizeOfVolume(napi_env env, napi_callback_info info)
90 {
91 if (!IsSystemApp()) {
92 NError(E_PERMISSION_SYS).ThrowErr(env);
93 return nullptr;
94 }
95 NFuncArg funcArg(env, info);
96 if (!funcArg.InitArgs((int)NARG_CNT::ONE, (int)NARG_CNT::TWO)) {
97 NError(E_PARAMS).ThrowErr(env);
98 return nullptr;
99 }
100
101 bool succ = false;
102 std::unique_ptr<char []> uuid;
103 tie(succ, uuid, std::ignore) = NVal(env, funcArg[(int)NARG_POS::FIRST]).ToUTF8String();
104 if (!succ) {
105 NError(E_PARAMS).ThrowErr(env);
106 return nullptr;
107 }
108
109 auto resultSize = std::make_shared<int64_t>();
110 std::string uuidString(uuid.get());
111 auto cbExec = [uuidString, resultSize]() -> NError {
112 int32_t errNum = DelayedSingleton<StorageManagerConnect>::GetInstance()->GetFreeSizeOfVolume(uuidString,
113 *resultSize);
114 if (errNum != E_OK) {
115 return NError(Convert2JsErrNum(errNum));
116 }
117 return NError(ERRNO_NOERR);
118 };
119 auto cbComplete = [resultSize](napi_env env, NError err) -> NVal {
120 if (err) {
121 return { env, err.GetNapiErr(env) };
122 }
123 return { NVal::CreateInt64(env, *resultSize) };
124 };
125
126 std::string procedureName = "getFreeSizeOfVolume";
127 NVal thisVar(env, funcArg.GetThisVar());
128 if (funcArg.GetArgc() == (uint)NARG_CNT::ONE) {
129 return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_;
130 } else {
131 NVal cb(env, funcArg[(int)NARG_POS::SECOND]);
132 return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_;
133 }
134 }
135
ExtractNameAndIndex(napi_env env,napi_callback_info info)136 std::tuple<std::string, int32_t, uint32_t> ExtractNameAndIndex(napi_env env, napi_callback_info info)
137 {
138 NFuncArg funcArg(env, info);
139 if (!funcArg.InitArgs((int)NARG_CNT::ONE, (int)NARG_CNT::FOUR)) {
140 NError(E_PARAMS).ThrowErr(env);
141 return std::make_tuple(EMPTY_STRING, INVALID_INDEX, INVALID_STATFLAG);
142 }
143 bool succ = false;
144 std::unique_ptr<char []> name;
145 tie(succ, name, std::ignore) = NVal(env, funcArg[(int)NARG_POS::FIRST]).ToUTF8String();
146 if (!succ) {
147 NError(E_PARAMS).ThrowErr(env);
148 return std::make_tuple(EMPTY_STRING, INVALID_INDEX, INVALID_STATFLAG);
149 }
150 std::string nameString(name.get());
151 int32_t index = 0;
152 uint32_t statFlag = 0;
153 if (funcArg.GetArgc() == (uint)NARG_CNT::FOUR) {
154 std::tie(succ, index) = NVal(env, funcArg[(int)NARG_POS::THIRD]).ToInt32();
155 std::tie(succ, statFlag) = NVal(env, funcArg[(int)NARG_POS::FOURTH]).ToUint32();
156 } else if (funcArg.GetArgc() == (uint)NARG_CNT::THREE) {
157 if (NVal(env, funcArg[(int)NARG_POS::SECOND]).TypeIs(napi_number)) {
158 std::tie(succ, index) = NVal(env, funcArg[(int)NARG_POS::SECOND]).ToInt32();
159 std::tie(succ, statFlag) = NVal(env, funcArg[(int)NARG_POS::THIRD]).ToUint32();
160 } else {
161 std::tie(succ, index) = NVal(env, funcArg[(int)NARG_POS::THIRD]).ToInt32();
162 }
163 } else if (NVal(env, funcArg[(int)NARG_POS::SECOND]).TypeIs(napi_number)) {
164 std::tie(succ, index) = NVal(env, funcArg[(int)NARG_POS::SECOND]).ToInt32();
165 }
166 if (!succ) {
167 NError(E_PARAMS).ThrowErr(env);
168 return std::make_tuple(EMPTY_STRING, INVALID_INDEX, INVALID_STATFLAG);
169 }
170 return std::make_tuple(nameString, index, statFlag);
171 }
172
GetBundleStats(napi_env env,napi_callback_info info)173 napi_value GetBundleStats(napi_env env, napi_callback_info info)
174 {
175 if (!IsSystemApp()) {
176 NError(E_PERMISSION_SYS).ThrowErr(env);
177 return nullptr;
178 }
179 auto result = ExtractNameAndIndex(env, info);
180 if (std::get<0>(result).empty()) {
181 LOGE("Extract pkgName and index from arguments failed");
182 NError(E_PARAMS).ThrowErr(env);
183 return nullptr;
184 }
185 std::string nameString = std::get<0>(result);
186 int32_t index = std::get<1>(result);
187 int32_t statFlag = static_cast<int32_t>(std::get<2>(result));
188 auto bundleStats = std::make_shared<BundleStats>();
189 auto cbExec = [nameString, bundleStats, index, statFlag]() -> NError {
190 int32_t errNum = DelayedSingleton<StorageManagerConnect>::GetInstance()->GetBundleStats(nameString,
191 *bundleStats, index, statFlag);
192 if (errNum != E_OK) {
193 return NError(Convert2JsErrNum(errNum));
194 }
195 return NError(ERRNO_NOERR);
196 };
197 auto cbComplete = [bundleStats](napi_env env, NError err) -> NVal {
198 if (err) {
199 return { env, err.GetNapiErr(env) };
200 }
201 NVal bundleObject = NVal::CreateObject(env);
202 bundleObject.AddProp("appSize", NVal::CreateInt64(env, (bundleStats->appSize_)).val_);
203 bundleObject.AddProp("cacheSize", NVal::CreateInt64(env,
204 (bundleStats->cacheSize_)).val_);
205 bundleObject.AddProp("dataSize", NVal::CreateInt64(env, (bundleStats->dataSize_)).val_);
206 return bundleObject;
207 };
208 std::string procedureName = "GetBundleStats";
209 NFuncArg funcArg(env, info);
210 funcArg.InitArgs((int)NARG_CNT::ONE, (int)NARG_CNT::THREE);
211 NVal thisVar(env, funcArg.GetThisVar());
212 if (funcArg.GetArgc() == (uint)NARG_CNT::ONE || NVal(env, funcArg[(int)NARG_POS::SECOND]).TypeIs(napi_number)) {
213 return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_;
214 } else {
215 NVal cb(env, funcArg[(int)NARG_POS::SECOND]);
216 return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_;
217 }
218 }
219
GetCurrentBundleStats(napi_env env,napi_callback_info info)220 napi_value GetCurrentBundleStats(napi_env env, napi_callback_info info)
221 {
222 NFuncArg funcArg(env, info);
223 if (!funcArg.InitArgs((int)NARG_CNT::ZERO, (int)NARG_CNT::ONE)) {
224 NError(E_PARAMS).ThrowErr(env);
225 return nullptr;
226 }
227 auto bundleStats = std::make_shared<BundleStats>();
228 uint32_t statFlag = 0;
229 if (funcArg.GetArgc() >= 1) {
230 NVal flag(env, NVal(env, funcArg[(int)NARG_POS::SECOND]).val_);
231 if (flag.TypeIs(napi_number)) {
232 bool succ = false;
233 std::tie(succ, statFlag) = NVal(env, funcArg[(int)NARG_POS::SECOND]).ToUint32();
234 if (!succ) {
235 NError(E_PARAMS).ThrowErr(env);
236 return nullptr;
237 }
238 }
239 }
240
241 auto cbExec = [bundleStats, statFlag]() -> NError {
242 int32_t errNum = DelayedSingleton<StorageManagerConnect>::GetInstance()->GetCurrentBundleStats(*bundleStats,
243 statFlag);
244 if (errNum != E_OK) {
245 return NError(Convert2JsErrNum(errNum));
246 }
247 return NError(ERRNO_NOERR);
248 };
249 auto cbComplete = [bundleStats](napi_env env, NError err) -> NVal {
250 if (err) {
251 return { env, err.GetNapiErr(env) };
252 }
253 NVal bundleObject = NVal::CreateObject(env);
254 bundleObject.AddProp("appSize", NVal::CreateInt64(env, (bundleStats->appSize_)).val_);
255 bundleObject.AddProp("cacheSize", NVal::CreateInt64(env,
256 (bundleStats->cacheSize_)).val_);
257 bundleObject.AddProp("dataSize", NVal::CreateInt64(env, (bundleStats->dataSize_)).val_);
258 return bundleObject;
259 };
260 std::string procedureName = "GetCurrentBundleStats";
261 NVal thisVar(env, funcArg.GetThisVar());
262 if (funcArg.GetArgc() == (uint)NARG_CNT::ZERO) {
263 return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_;
264 } else {
265 NVal cb(env, funcArg[(int)NARG_POS::FIRST]);
266 return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_;
267 }
268 }
269
GetSystemSize(napi_env env,napi_callback_info info)270 napi_value GetSystemSize(napi_env env, napi_callback_info info)
271 {
272 if (!IsSystemApp()) {
273 NError(E_PERMISSION_SYS).ThrowErr(env);
274 return nullptr;
275 }
276 NFuncArg funcArg(env, info);
277 if (!funcArg.InitArgs((int)NARG_CNT::ZERO, (int)NARG_CNT::ONE)) {
278 NError(E_PARAMS).ThrowErr(env);
279 return nullptr;
280 }
281
282 auto resultSize = std::make_shared<int64_t>();
283 auto cbExec = [resultSize]() -> NError {
284 int32_t errNum = DelayedSingleton<StorageManagerConnect>::GetInstance()->GetSystemSize(*resultSize);
285 if (errNum != E_OK) {
286 return NError(Convert2JsErrNum(errNum));
287 }
288 return NError(ERRNO_NOERR);
289 };
290 auto cbComplete = [resultSize](napi_env env, NError err) -> NVal {
291 if (err) {
292 return { env, err.GetNapiErr(env) };
293 }
294 return { NVal::CreateInt64(env, *resultSize) };
295 };
296
297 std::string procedureName = "GetSystemSize";
298 NVal thisVar(env, funcArg.GetThisVar());
299 if (funcArg.GetArgc() == (uint)NARG_CNT::ZERO) {
300 return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_;
301 } else {
302 NVal cb(env, funcArg[(int)NARG_POS::FIRST]);
303 return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_;
304 }
305 }
306
GetUserStorageStats(napi_env env,napi_callback_info info)307 napi_value GetUserStorageStats(napi_env env, napi_callback_info info)
308 {
309 if (!IsSystemApp()) {
310 NError(E_PERMISSION_SYS).ThrowErr(env);
311 return nullptr;
312 }
313 NFuncArg funcArg(env, info);
314 if (!funcArg.InitArgs((int)NARG_CNT::ZERO, (int)NARG_CNT::TWO)) {
315 NError(E_PARAMS).ThrowErr(env);
316 return nullptr;
317 }
318 bool fac = false;
319 int64_t userId = -1;
320 if (funcArg.GetArgc() >= 1) {
321 NVal ui(env, NVal(env, funcArg[(int)NARG_POS::FIRST]).val_);
322 if (ui.TypeIs(napi_number)) {
323 bool succ = false;
324 std::tie(succ, userId) = NVal(env, funcArg[(int)NARG_POS::FIRST]).ToInt64();
325 if (!succ) {
326 NError(E_PARAMS).ThrowErr(env);
327 return nullptr;
328 }
329 fac = true;
330 }
331 }
332
333 auto storageStats = std::make_shared<StorageStats>();
334 auto cbExec = [fac, userId, storageStats]() -> NError {
335 int32_t errNum;
336 if (!fac) {
337 errNum = DelayedSingleton<StorageManagerConnect>::GetInstance()->GetUserStorageStats(*storageStats);
338 } else {
339 errNum = DelayedSingleton<StorageManagerConnect>::GetInstance()->GetUserStorageStats(userId, *storageStats);
340 }
341 if (errNum != E_OK) {
342 return NError(Convert2JsErrNum(errNum));
343 }
344 return NError(ERRNO_NOERR);
345 };
346 auto cbComplete = [storageStats](napi_env env, NError err) -> NVal {
347 if (err) {
348 return { env, err.GetNapiErr(env) };
349 }
350 NVal totalObject = NVal::CreateObject(env);
351 totalObject.AddProp("total", NVal::CreateInt64(env, (storageStats->total_)).val_);
352 totalObject.AddProp("audio", NVal::CreateInt64(env, (storageStats->audio_)).val_);
353 totalObject.AddProp("video", NVal::CreateInt64(env, (storageStats->video_)).val_);
354 totalObject.AddProp("image", NVal::CreateInt64(env, (storageStats->image_)).val_);
355 totalObject.AddProp("file", NVal::CreateInt64(env, (storageStats->file_)).val_);
356 totalObject.AddProp("app", NVal::CreateInt64(env, (storageStats->app_)).val_);
357 return totalObject;
358 };
359 std::string procedureName = "GetUserStorageStats";
360 NVal thisVar(env, funcArg.GetThisVar());
361 if (funcArg.GetArgc() == (uint)NARG_CNT::ZERO || (funcArg.GetArgc() == (uint)NARG_CNT::ONE && fac)) {
362 return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_;
363 } else {
364 if (!fac) {
365 NVal cb(env, funcArg[(int)NARG_POS::FIRST]);
366 return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_;
367 }
368 NVal cb(env, funcArg[(int)NARG_POS::SECOND]);
369 return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_;
370 }
371 }
372
GetTotalSize(napi_env env,napi_callback_info info)373 napi_value GetTotalSize(napi_env env, napi_callback_info info)
374 {
375 NFuncArg funcArg(env, info);
376 if (!funcArg.InitArgs((int)NARG_CNT::ZERO, (int)NARG_CNT::ONE)) {
377 NError(E_PARAMS).ThrowErr(env);
378 return nullptr;
379 }
380
381 auto resultSize = std::make_shared<int64_t>();
382 auto cbExec = [resultSize]() -> NError {
383 int32_t errNum = DelayedSingleton<StorageManagerConnect>::GetInstance()->GetTotalSize(*resultSize);
384 if (errNum != E_OK) {
385 return NError(Convert2JsErrNum(errNum));
386 }
387 return NError(ERRNO_NOERR);
388 };
389 auto cbComplete = [resultSize](napi_env env, NError err) -> NVal {
390 if (err) {
391 return { env, err.GetNapiErr(env) };
392 }
393 return { NVal::CreateInt64(env, *resultSize) };
394 };
395
396 std::string procedureName = "GetTotalSize";
397 NVal thisVar(env, funcArg.GetThisVar());
398 if (funcArg.GetArgc() == (uint)NARG_CNT::ZERO) {
399 return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_;
400 } else {
401 NVal cb(env, funcArg[(int)NARG_POS::FIRST]);
402 return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_;
403 }
404 }
405
GetFreeSize(napi_env env,napi_callback_info info)406 napi_value GetFreeSize(napi_env env, napi_callback_info info)
407 {
408 NFuncArg funcArg(env, info);
409 if (!funcArg.InitArgs((int)NARG_CNT::ZERO, (int)NARG_CNT::ONE)) {
410 NError(E_PARAMS).ThrowErr(env);
411 return nullptr;
412 }
413
414 auto resultSize = std::make_shared<int64_t>();
415 auto cbExec = [resultSize]() -> NError {
416 int32_t errNum = DelayedSingleton<StorageManagerConnect>::GetInstance()->GetFreeSize(*resultSize);
417 if (errNum != E_OK) {
418 return NError(Convert2JsErrNum(errNum));
419 }
420 return NError(ERRNO_NOERR);
421 };
422 auto cbComplete = [resultSize](napi_env env, NError err) -> NVal {
423 if (err) {
424 return { env, err.GetNapiErr(env) };
425 }
426 return { NVal::CreateInt64(env, *resultSize) };
427 };
428
429 std::string procedureName = "GetFreeSize";
430 NVal thisVar(env, funcArg.GetThisVar());
431 if (funcArg.GetArgc() == (uint)NARG_CNT::ZERO) {
432 return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_;
433 } else {
434 NVal cb(env, funcArg[(int)NARG_POS::FIRST]);
435 return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_;
436 }
437 }
438
GetTotalSizeSync(napi_env env,napi_callback_info info)439 napi_value GetTotalSizeSync(napi_env env, napi_callback_info info)
440 {
441 NFuncArg funcArg(env, info);
442 if (!funcArg.InitArgs((int)NARG_CNT::ZERO)) {
443 NError(E_PARAMS).ThrowErr(env);
444 return nullptr;
445 }
446
447 auto resultSize = std::make_shared<int64_t>();
448
449 int32_t errNum = DelayedSingleton<StorageManagerConnect>::GetInstance()->GetTotalSize(*resultSize);
450 if (errNum != E_OK) {
451 NError(Convert2JsErrNum(errNum)).ThrowErr(env);
452 return nullptr;
453 }
454
455 return NVal::CreateInt64(env, *resultSize).val_;
456 }
457
GetFreeSizeSync(napi_env env,napi_callback_info info)458 napi_value GetFreeSizeSync(napi_env env, napi_callback_info info)
459 {
460 NFuncArg funcArg(env, info);
461 if (!funcArg.InitArgs((int)NARG_CNT::ZERO)) {
462 NError(E_PARAMS).ThrowErr(env);
463 return nullptr;
464 }
465
466 auto resultSize = std::make_shared<int64_t>();
467
468 int32_t errNum = DelayedSingleton<StorageManagerConnect>::GetInstance()->GetFreeSize(*resultSize);
469 if (errNum != E_OK) {
470 NError(Convert2JsErrNum(errNum)).ThrowErr(env);
471 return nullptr;
472 }
473 return NVal::CreateInt64(env, *resultSize).val_;
474 }
475 } // namespace StorageManager
476 } // namespace OHOS
477