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 "volumemanager_n_exporter.h"
17
18 #include <singleton.h>
19 #include <tuple>
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_func_arg.h"
25 #include "n_val.h"
26 #include "n_error.h"
27 #include "storage_manager_connect.h"
28 #include "storage_service_log.h"
29 #include "storage_service_errno.h"
30
31 using namespace OHOS::StorageManager;
32 using namespace OHOS::FileManagement::LibN;
33
34 namespace OHOS {
35 namespace StorageManager {
36 namespace ModuleVolumeManager {
GetAllVolumes(napi_env env,napi_callback_info info)37 napi_value GetAllVolumes(napi_env env, napi_callback_info info)
38 {
39 if (!IsSystemApp()) {
40 NError(E_PERMISSION_SYS).ThrowErr(env);
41 return nullptr;
42 }
43 NFuncArg funcArg(env, info);
44 if (!funcArg.InitArgs((int)NARG_CNT::ZERO, (int)NARG_CNT::ONE)) {
45 NError(E_PARAMS).ThrowErr(env);
46 return nullptr;
47 }
48 auto volumeInfo = std::make_shared<std::vector<VolumeExternal>>();
49 auto cbExec = [volumeInfo]() -> NError {
50 int32_t errNum = DelayedSingleton<StorageManagerConnect>::GetInstance()->GetAllVolumes(*volumeInfo);
51 if (errNum != E_OK) {
52 return NError(Convert2JsErrNum(errNum));
53 }
54 return NError(ERRNO_NOERR);
55 };
56 auto cbComplete = [volumeInfo](napi_env env, NError err) -> NVal {
57 if (err) {
58 return { env, err.GetNapiErr(env) };
59 }
60 napi_value volumeInfoArray = nullptr;
61 napi_status status = napi_create_array(env, &volumeInfoArray);
62 if (status != napi_ok) {
63 return { env, NError(status).GetNapiErr(env) };
64 }
65 for (size_t i = 0; i < (*volumeInfo).size(); i++) {
66 NVal volumeInfoObject = NVal::CreateObject(env);
67 volumeInfoObject.AddProp("id", NVal::CreateUTF8String(env, (*volumeInfo)[i].GetId()).val_);
68 volumeInfoObject.AddProp("uuid", NVal::CreateUTF8String(env, (*volumeInfo)[i].GetUuid()).val_);
69 volumeInfoObject.AddProp("diskId", NVal::CreateUTF8String(env, (*volumeInfo)[i].GetDiskId()).val_);
70 volumeInfoObject.AddProp("description",
71 NVal::CreateUTF8String(env, (*volumeInfo)[i].GetDescription()).val_);
72 volumeInfoObject.AddProp("removable", NVal::CreateBool(env, (bool)true).val_);
73 volumeInfoObject.AddProp("state", NVal::CreateInt32(env, (*volumeInfo)[i].GetState()).val_);
74 volumeInfoObject.AddProp("path", NVal::CreateUTF8String(env, (*volumeInfo)[i].GetPath()).val_);
75 status = napi_set_element(env, volumeInfoArray, i, volumeInfoObject.val_);
76 if (status != napi_ok) {
77 return { env, NError(status).GetNapiErr(env) };
78 }
79 }
80 return { NVal(env, volumeInfoArray) };
81 };
82 std::string procedureName = "GetAllVolumes";
83 NVal thisVar(env, funcArg.GetThisVar());
84 if (funcArg.GetArgc() == (uint)NARG_CNT::ZERO) {
85 return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_;
86 } else {
87 NVal cb(env, funcArg[(int)NARG_POS::FIRST]);
88 return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_;
89 }
90 }
91
92
Mount(napi_env env,napi_callback_info info)93 napi_value Mount(napi_env env, napi_callback_info info)
94 {
95 if (!IsSystemApp()) {
96 NError(E_PERMISSION_SYS).ThrowErr(env);
97 return nullptr;
98 }
99 NFuncArg funcArg(env, info);
100 if (!funcArg.InitArgs((int)NARG_CNT::ONE, (int)NARG_CNT::TWO)) {
101 NError(E_PARAMS).ThrowErr(env);
102 return nullptr;
103 }
104
105 bool succ = false;
106 std::unique_ptr<char []> volumeId;
107 tie(succ, volumeId, std::ignore) = NVal(env, funcArg[(int)NARG_POS::FIRST]).ToUTF8String();
108 if (!succ) {
109 NError(E_PARAMS).ThrowErr(env);
110 return nullptr;
111 }
112
113 std::string volumeIdString(volumeId.get());
114 auto cbExec = [volumeIdString]() -> NError {
115 int32_t result = DelayedSingleton<StorageManagerConnect>::GetInstance()->Mount(volumeIdString);
116 if (result != E_OK) {
117 return NError(Convert2JsErrNum(result));
118 }
119 return NError(ERRNO_NOERR);
120 };
121 auto cbComplete = [](napi_env env, NError err) -> NVal {
122 if (err) {
123 return { env, err.GetNapiErr(env) };
124 }
125 return { NVal::CreateUndefined(env) };
126 };
127
128 std::string procedureName = "Mount";
129 NVal thisVar(env, funcArg.GetThisVar());
130 if (funcArg.GetArgc() == (uint)NARG_CNT::ONE) {
131 return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_;
132 } else {
133 NVal cb(env, funcArg[(int)NARG_POS::SECOND]);
134 return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_;
135 }
136 }
137
Unmount(napi_env env,napi_callback_info info)138 napi_value Unmount(napi_env env, napi_callback_info info)
139 {
140 if (!IsSystemApp()) {
141 NError(E_PERMISSION_SYS).ThrowErr(env);
142 return nullptr;
143 }
144 NFuncArg funcArg(env, info);
145 if (!funcArg.InitArgs((int)NARG_CNT::ONE, (int)NARG_CNT::TWO)) {
146 NError(E_PARAMS).ThrowErr(env);
147 return nullptr;
148 }
149
150 bool succ = false;
151 std::unique_ptr<char []> volumeId;
152 tie(succ, volumeId, std::ignore) = NVal(env, funcArg[(int)NARG_POS::FIRST]).ToUTF8String();
153 if (!succ) {
154 NError(E_PARAMS).ThrowErr(env);
155 return nullptr;
156 }
157
158 std::string volumeIdString(volumeId.get());
159 auto cbExec = [volumeIdString]() -> NError {
160 int32_t result = DelayedSingleton<StorageManagerConnect>::GetInstance()->Unmount(volumeIdString);
161 if (result != E_OK) {
162 return NError(Convert2JsErrNum(result));
163 }
164 return NError(ERRNO_NOERR);
165 };
166 auto cbComplete = [](napi_env env, NError err) -> NVal {
167 if (err) {
168 return { env, err.GetNapiErr(env) };
169 }
170 return { NVal::CreateUndefined(env) };
171 };
172
173 std::string procedureName = "Unmount";
174 NVal thisVar(env, funcArg.GetThisVar());
175 if (funcArg.GetArgc() == (uint)NARG_CNT::ONE) {
176 return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_;
177 } else {
178 NVal cb(env, funcArg[(int)NARG_POS::SECOND]);
179 return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_;
180 }
181 }
182
183
GetVolumeByUuid(napi_env env,napi_callback_info info)184 napi_value GetVolumeByUuid(napi_env env, napi_callback_info info)
185 {
186 if (!IsSystemApp()) {
187 NError(E_PERMISSION_SYS).ThrowErr(env);
188 return nullptr;
189 }
190 NFuncArg funcArg(env, info);
191 if (!funcArg.InitArgs((int)NARG_CNT::ONE, (int)NARG_CNT::TWO)) {
192 NError(E_PARAMS).ThrowErr(env);
193 return nullptr;
194 }
195
196 bool succ = false;
197 std::unique_ptr<char []> uuid;
198 tie(succ, uuid, std::ignore) = NVal(env, funcArg[(int)NARG_POS::FIRST]).ToUTF8String();
199 if (!succ) {
200 NError(E_PARAMS).ThrowErr(env);
201 return nullptr;
202 }
203
204 auto volumeInfo = std::make_shared<VolumeExternal>();
205 std::string uuidString(uuid.get());
206 auto cbExec = [uuidString, volumeInfo]() -> NError {
207 int32_t errNum = DelayedSingleton<StorageManagerConnect>::GetInstance()->GetVolumeByUuid(uuidString,
208 *volumeInfo);
209 if (errNum != E_OK) {
210 return NError(Convert2JsErrNum(errNum));
211 }
212 return NError(ERRNO_NOERR);
213 };
214 auto cbComplete = [volumeInfo](napi_env env, NError err) -> NVal {
215 if (err) {
216 return { env, err.GetNapiErr(env) };
217 }
218 NVal volumeObject = NVal::CreateObject(env);
219 volumeObject.AddProp("id", NVal::CreateUTF8String(env, volumeInfo->GetId()).val_);
220 volumeObject.AddProp("uuid", NVal::CreateUTF8String(env, volumeInfo->GetUuid()).val_);
221 volumeObject.AddProp("diskId", NVal::CreateUTF8String(env, volumeInfo->GetDiskId()).val_);
222 volumeObject.AddProp("description",
223 NVal::CreateUTF8String(env, volumeInfo->GetDescription()).val_);
224 volumeObject.AddProp("removable", NVal::CreateBool(env, (bool)true).val_);
225 volumeObject.AddProp("state", NVal::CreateInt32(env, volumeInfo->GetState()).val_);
226 volumeObject.AddProp("path", NVal::CreateUTF8String(env, volumeInfo->GetPath()).val_);
227
228 return volumeObject;
229 };
230
231 std::string procedureName = "GetVolumeByUuid";
232 NVal thisVar(env, funcArg.GetThisVar());
233 if (funcArg.GetArgc() == (uint)NARG_CNT::ONE) {
234 return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_;
235 } else {
236 NVal cb(env, funcArg[(int)NARG_POS::SECOND]);
237 return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_;
238 }
239 }
240
241
GetVolumeById(napi_env env,napi_callback_info info)242 napi_value GetVolumeById(napi_env env, napi_callback_info info)
243 {
244 if (!IsSystemApp()) {
245 NError(E_PERMISSION_SYS).ThrowErr(env);
246 return nullptr;
247 }
248 NFuncArg funcArg(env, info);
249 if (!funcArg.InitArgs((int)NARG_CNT::ONE, (int)NARG_CNT::TWO)) {
250 NError(E_PARAMS).ThrowErr(env);
251 return nullptr;
252 }
253
254 bool succ = false;
255 std::unique_ptr<char []> volumeId;
256 tie(succ, volumeId, std::ignore) = NVal(env, funcArg[(int)NARG_POS::FIRST]).ToUTF8String();
257 if (!succ) {
258 NError(E_PARAMS).ThrowErr(env);
259 return nullptr;
260 }
261
262 auto volumeInfo = std::make_shared<VolumeExternal>();
263 std::string volumeIdString(volumeId.get());
264 auto cbExec = [volumeIdString, volumeInfo]() -> NError {
265 int32_t errNum = DelayedSingleton<StorageManagerConnect>::GetInstance()->GetVolumeById(volumeIdString,
266 *volumeInfo);
267 if (errNum != E_OK) {
268 return NError(Convert2JsErrNum(errNum));
269 }
270 return NError(ERRNO_NOERR);
271 };
272 auto cbComplete = [volumeInfo](napi_env env, NError err) -> NVal {
273 if (err) {
274 return { env, err.GetNapiErr(env) };
275 }
276 NVal volumeObject = NVal::CreateObject(env);
277 volumeObject.AddProp("id", NVal::CreateUTF8String(env, volumeInfo->GetId()).val_);
278 volumeObject.AddProp("uuid", NVal::CreateUTF8String(env, volumeInfo->GetUuid()).val_);
279 volumeObject.AddProp("diskId", NVal::CreateUTF8String(env, volumeInfo->GetDiskId()).val_);
280 volumeObject.AddProp("description",
281 NVal::CreateUTF8String(env, volumeInfo->GetDescription()).val_);
282 volumeObject.AddProp("removable", NVal::CreateBool(env, (bool)true).val_);
283 volumeObject.AddProp("state", NVal::CreateInt32(env, volumeInfo->GetState()).val_);
284 volumeObject.AddProp("path", NVal::CreateUTF8String(env, volumeInfo->GetPath()).val_);
285
286 return volumeObject;
287 };
288
289 std::string procedureName = "GetVolumeById";
290 NVal thisVar(env, funcArg.GetThisVar());
291 if (funcArg.GetArgc() == (uint)NARG_CNT::ONE) {
292 return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_;
293 } else {
294 NVal cb(env, funcArg[(int)NARG_POS::SECOND]);
295 return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_;
296 }
297 }
298
SetVolumeDescription(napi_env env,napi_callback_info info)299 napi_value SetVolumeDescription(napi_env env, napi_callback_info info)
300 {
301 if (!IsSystemApp()) {
302 NError(E_PERMISSION_SYS).ThrowErr(env);
303 return nullptr;
304 }
305 NFuncArg funcArg(env, info);
306 if (!funcArg.InitArgs((int)NARG_CNT::TWO, (int)NARG_CNT::THREE)) {
307 NError(E_PARAMS).ThrowErr(env);
308 return nullptr;
309 }
310
311 bool succ = false;
312 std::unique_ptr<char []> uuid;
313 std::unique_ptr<char []> description;
314 tie(succ, uuid, std::ignore) = NVal(env, funcArg[(int)NARG_POS::FIRST]).ToUTF8String();
315 if (!succ) {
316 NError(E_PARAMS).ThrowErr(env);
317 return nullptr;
318 }
319
320 tie(succ, description, std::ignore) = NVal(env, funcArg[(int)NARG_POS::SECOND]).ToUTF8String();
321 if (!succ) {
322 NError(E_PARAMS).ThrowErr(env);
323 return nullptr;
324 }
325
326 std::string uuidString(uuid.get());
327 std::string descStr(description.get());
328 auto cbExec = [uuidString, descStr]() -> NError {
329 int32_t result = DelayedSingleton<StorageManagerConnect>::GetInstance()->SetVolumeDescription(uuidString,
330 descStr);
331 if (result != E_OK) {
332 return NError(Convert2JsErrNum(result));
333 }
334 return NError(ERRNO_NOERR);
335 };
336 auto cbComplete = [](napi_env env, NError err) -> NVal {
337 if (err) {
338 return { env, err.GetNapiErr(env) };
339 }
340 return { NVal::CreateUndefined(env) };
341 };
342
343 std::string procedureName = "SetVolumeDescription";
344 NVal thisVar(env, funcArg.GetThisVar());
345 if (funcArg.GetArgc() == (uint)NARG_CNT::TWO) {
346 return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_;
347 } else {
348 NVal cb(env, funcArg[(int)NARG_POS::THIRD]);
349 return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_;
350 }
351 }
352
Format(napi_env env,napi_callback_info info)353 napi_value Format(napi_env env, napi_callback_info info)
354 {
355 if (!IsSystemApp()) {
356 NError(E_PERMISSION_SYS).ThrowErr(env);
357 return nullptr;
358 }
359 NFuncArg funcArg(env, info);
360 if (!funcArg.InitArgs((int)NARG_CNT::TWO, (int)NARG_CNT::THREE)) {
361 NError(E_PARAMS).ThrowErr(env);
362 return nullptr;
363 }
364
365 bool succ = false;
366 std::unique_ptr<char []> volumeId;
367 std::unique_ptr<char []> fsType;
368 tie(succ, volumeId, std::ignore) = NVal(env, funcArg[(int)NARG_POS::FIRST]).ToUTF8String();
369 if (!succ) {
370 NError(E_PARAMS).ThrowErr(env);
371 return nullptr;
372 }
373
374 tie(succ, fsType, std::ignore) = NVal(env, funcArg[(int)NARG_POS::SECOND]).ToUTF8String();
375 if (!succ) {
376 NError(E_PARAMS).ThrowErr(env);
377 return nullptr;
378 }
379
380 std::string volumeIdString(volumeId.get());
381 std::string fsTypeString(fsType.get());
382 auto cbExec = [volumeIdString, fsTypeString]() -> NError {
383 int32_t result = DelayedSingleton<StorageManagerConnect>::GetInstance()->Format(volumeIdString, fsTypeString);
384 if (result != E_OK) {
385 return NError(Convert2JsErrNum(result));
386 }
387 return NError(ERRNO_NOERR);
388 };
389 auto cbComplete = [](napi_env env, NError err) -> NVal {
390 if (err) {
391 return { env, err.GetNapiErr(env) };
392 }
393 return { NVal::CreateUndefined(env) };
394 };
395
396 std::string procedureName = "Format";
397 NVal thisVar(env, funcArg.GetThisVar());
398 if (funcArg.GetArgc() == (uint)NARG_CNT::TWO) {
399 return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_;
400 } else {
401 NVal cb(env, funcArg[(int)NARG_POS::THIRD]);
402 return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_;
403 }
404 }
405
Partition(napi_env env,napi_callback_info info)406 napi_value Partition(napi_env env, napi_callback_info info)
407 {
408 if (!IsSystemApp()) {
409 NError(E_PERMISSION_SYS).ThrowErr(env);
410 return nullptr;
411 }
412 NFuncArg funcArg(env, info);
413 if (!funcArg.InitArgs((int)NARG_CNT::TWO, (int)NARG_CNT::THREE)) {
414 NError(E_PARAMS).ThrowErr(env);
415 return nullptr;
416 }
417
418 bool succ = false;
419 std::unique_ptr<char []> diskId;
420 int32_t type;
421 tie(succ, diskId, std::ignore) = NVal(env, funcArg[(int)NARG_POS::FIRST]).ToUTF8String();
422 if (!succ) {
423 NError(E_PARAMS).ThrowErr(env);
424 return nullptr;
425 }
426
427 std::tie(succ, type) = NVal(env, funcArg[(int)NARG_POS::SECOND]).ToInt32();
428 if (!succ) {
429 NError(E_PARAMS).ThrowErr(env);
430 return nullptr;
431 }
432
433 std::string diskIdString(diskId.get());
434 auto cbExec = [diskIdString, type]() -> NError {
435 int32_t result = DelayedSingleton<StorageManagerConnect>::GetInstance()->Partition(diskIdString, type);
436 if (result != E_OK) {
437 return NError(Convert2JsErrNum(result));
438 }
439 return NError(ERRNO_NOERR);
440 };
441 auto cbComplete = [](napi_env env, NError err) -> NVal {
442 if (err) {
443 return { env, err.GetNapiErr(env) };
444 }
445 return { NVal::CreateUndefined(env) };
446 };
447
448 std::string procedureName = "Partition";
449 NVal thisVar(env, funcArg.GetThisVar());
450 if (funcArg.GetArgc() == (uint)NARG_CNT::TWO) {
451 return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_;
452 } else {
453 NVal cb(env, funcArg[(int)NARG_POS::THIRD]);
454 return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_;
455 }
456 }
457 } // namespace ModuleVolumeManager
458 } // namespace StorageManager
459 } // namespace OHOS
460