• 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     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