• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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     if (!IsSystemApp()) {
376         NError(E_PERMISSION_SYS).ThrowErr(env);
377         return nullptr;
378     }
379     NFuncArg funcArg(env, info);
380     if (!funcArg.InitArgs((int)NARG_CNT::ZERO, (int)NARG_CNT::ONE)) {
381         NError(E_PARAMS).ThrowErr(env);
382         return nullptr;
383     }
384 
385     auto resultSize = std::make_shared<int64_t>();
386     auto cbExec = [resultSize]() -> NError {
387         int32_t errNum = DelayedSingleton<StorageManagerConnect>::GetInstance()->GetTotalSize(*resultSize);
388         if (errNum != E_OK) {
389             return NError(Convert2JsErrNum(errNum));
390         }
391         return NError(ERRNO_NOERR);
392     };
393     auto cbComplete = [resultSize](napi_env env, NError err) -> NVal {
394         if (err) {
395             return { env, err.GetNapiErr(env) };
396         }
397         return { NVal::CreateInt64(env, *resultSize) };
398     };
399 
400     std::string procedureName = "GetTotalSize";
401     NVal thisVar(env, funcArg.GetThisVar());
402     if (funcArg.GetArgc() == (uint)NARG_CNT::ZERO) {
403         return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_;
404     } else {
405         NVal cb(env, funcArg[(int)NARG_POS::FIRST]);
406         return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_;
407     }
408 }
409 
GetFreeSize(napi_env env,napi_callback_info info)410 napi_value GetFreeSize(napi_env env, napi_callback_info info)
411 {
412     if (!IsSystemApp()) {
413         NError(E_PERMISSION_SYS).ThrowErr(env);
414         return nullptr;
415     }
416     NFuncArg funcArg(env, info);
417     if (!funcArg.InitArgs((int)NARG_CNT::ZERO, (int)NARG_CNT::ONE)) {
418         NError(E_PARAMS).ThrowErr(env);
419         return nullptr;
420     }
421 
422     auto resultSize = std::make_shared<int64_t>();
423     auto cbExec = [resultSize]() -> NError {
424         int32_t errNum = DelayedSingleton<StorageManagerConnect>::GetInstance()->GetFreeSize(*resultSize);
425         if (errNum != E_OK) {
426             return NError(Convert2JsErrNum(errNum));
427         }
428         return NError(ERRNO_NOERR);
429     };
430     auto cbComplete = [resultSize](napi_env env, NError err) -> NVal {
431         if (err) {
432             return { env, err.GetNapiErr(env) };
433         }
434         return { NVal::CreateInt64(env, *resultSize) };
435     };
436 
437     std::string procedureName = "GetFreeSize";
438     NVal thisVar(env, funcArg.GetThisVar());
439     if (funcArg.GetArgc() == (uint)NARG_CNT::ZERO) {
440         return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_;
441     } else {
442         NVal cb(env, funcArg[(int)NARG_POS::FIRST]);
443         return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_;
444     }
445 }
446 
GetTotalSizeSync(napi_env env,napi_callback_info info)447 napi_value GetTotalSizeSync(napi_env env, napi_callback_info info)
448 {
449     if (!IsSystemApp()) {
450         NError(E_PERMISSION_SYS).ThrowErr(env);
451         return nullptr;
452     }
453     NFuncArg funcArg(env, info);
454     if (!funcArg.InitArgs((int)NARG_CNT::ZERO)) {
455         NError(E_PARAMS).ThrowErr(env);
456         return nullptr;
457     }
458 
459     auto resultSize = std::make_shared<int64_t>();
460 
461     int32_t errNum = DelayedSingleton<StorageManagerConnect>::GetInstance()->GetTotalSize(*resultSize);
462     if (errNum != E_OK) {
463         NError(Convert2JsErrNum(errNum)).ThrowErr(env);
464         return nullptr;
465     }
466 
467     return NVal::CreateInt64(env, *resultSize).val_;
468 }
469 
GetFreeSizeSync(napi_env env,napi_callback_info info)470 napi_value GetFreeSizeSync(napi_env env, napi_callback_info info)
471 {
472     if (!IsSystemApp()) {
473         NError(E_PERMISSION_SYS).ThrowErr(env);
474         return nullptr;
475     }
476     NFuncArg funcArg(env, info);
477     if (!funcArg.InitArgs((int)NARG_CNT::ZERO)) {
478         NError(E_PARAMS).ThrowErr(env);
479         return nullptr;
480     }
481 
482     auto resultSize = std::make_shared<int64_t>();
483 
484     int32_t errNum = DelayedSingleton<StorageManagerConnect>::GetInstance()->GetFreeSize(*resultSize);
485     if (errNum != E_OK) {
486         NError(Convert2JsErrNum(errNum)).ThrowErr(env);
487         return nullptr;
488     }
489     return NVal::CreateInt64(env, *resultSize).val_;
490 }
491 } // namespace StorageManager
492 } // namespace OHOS
493