1 /*
2 * Copyright (c) 2023 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 "cloud_sync_manager_n_exporter.h"
17
18 #include <map>
19
20 #include <sys/types.h>
21
22 #include "cloud_sync_common.h"
23 #include "cloud_sync_manager.h"
24 #include "dfs_error.h"
25 #include "utils_log.h"
26 #include "async_work.h"
27
28 namespace OHOS::FileManagement::CloudSync {
29 using namespace FileManagement::LibN;
30 using namespace std;
31
ChangeAppCloudSwitch(napi_env env,napi_callback_info info)32 napi_value ChangeAppCloudSwitch(napi_env env, napi_callback_info info)
33 {
34 NFuncArg funcArg(env, info);
35 if (!funcArg.InitArgs(static_cast<size_t>(NARG_CNT::THREE), static_cast<size_t>(NARG_CNT::FOUR))) {
36 NError(E_PARAMS).ThrowErr(env, "Number of arguments unmatched");
37 return nullptr;
38 }
39
40 bool succ = false;
41 std::unique_ptr<char []> accoutId;
42 std::unique_ptr<char []> bundleName;
43 bool status;
44
45 tie(succ, accoutId, std::ignore) = NVal(env, funcArg[(int)NARG_POS::FIRST]).ToUTF8String();
46 if (!succ) {
47 NError(E_PARAMS).ThrowErr(env);
48 return nullptr;
49 }
50
51 tie(succ, bundleName, std::ignore) = NVal(env, funcArg[(int)NARG_POS::SECOND]).ToUTF8String();
52 if (!succ) {
53 NError(E_PARAMS).ThrowErr(env);
54 return nullptr;
55 }
56
57 tie(succ, status) = NVal(env, funcArg[(int)NARG_POS::THIRD]).ToBool();
58 if (!succ) {
59 NError(E_PARAMS).ThrowErr(env);
60 return nullptr;
61 }
62
63 string accoutIdStr(accoutId.get());
64 string bundleNameStr(bundleName.get());
65
66 auto cbExec = [accoutIdStr, bundleNameStr, status]() -> NError {
67 int32_t result = CloudSyncManager::GetInstance().ChangeAppSwitch(accoutIdStr, bundleNameStr, status);
68 if (result == E_PERMISSION_DENIED || result == E_PERMISSION_SYSTEM) {
69 return result == E_PERMISSION_DENIED? NError(Convert2JsErrNum(E_PERMISSION_DENIED)) :
70 NError(Convert2JsErrNum(E_PERMISSION_SYSTEM));
71 }
72 return NError(ERRNO_NOERR);
73 };
74 auto cbComplete = [](napi_env env, NError err) -> NVal {
75 if (err) {
76 return { env, err.GetNapiErr(env) };
77 }
78 return { NVal::CreateUndefined(env) };
79 };
80
81 std::string procedureName = "ChangeAppCloudSwitch";
82 NVal thisVar(env, funcArg.GetThisVar());
83 auto asyncWork = GetPromiseOrCallBackWork(env, funcArg, static_cast<size_t>(NARG_CNT::FOUR));
84 return asyncWork == nullptr ? nullptr : asyncWork->Schedule(procedureName, cbExec, cbComplete).val_;
85 }
86
NotifyDataChangeInner(napi_env env,NFuncArg & funcArg)87 napi_value NotifyDataChangeInner(napi_env env, NFuncArg &funcArg)
88 {
89 LOGI("NotifyDataChangeInner entrance");
90 bool succ = false;
91 std::unique_ptr<char []> accoutId;
92 std::unique_ptr<char []> bundleName;
93
94 tie(succ, accoutId, std::ignore) = NVal(env, funcArg[(int)NARG_POS::FIRST]).ToUTF8String();
95 if (!succ) {
96 NError(E_PARAMS).ThrowErr(env);
97 return nullptr;
98 }
99
100 tie(succ, bundleName, std::ignore) = NVal(env, funcArg[(int)NARG_POS::SECOND]).ToUTF8String();
101 if (!succ) {
102 NError(E_PARAMS).ThrowErr(env);
103 return nullptr;
104 }
105
106 string accoutIdStr(accoutId.get());
107 string bundleNameStr(bundleName.get());
108
109 auto cbExec = [accoutIdStr, bundleNameStr]() -> NError {
110 int32_t result = CloudSyncManager::GetInstance().NotifyDataChange(accoutIdStr, bundleNameStr);
111 if (result == E_PERMISSION_DENIED || result == E_PERMISSION_SYSTEM) {
112 return result == E_PERMISSION_DENIED? NError(Convert2JsErrNum(E_PERMISSION_DENIED)) :
113 NError(Convert2JsErrNum(E_PERMISSION_SYSTEM));
114 }
115 return NError(ERRNO_NOERR);
116 };
117 auto cbComplete = [](napi_env env, NError err) -> NVal {
118 if (err) {
119 return { env, err.GetNapiErr(env) };
120 }
121 return { NVal::CreateUndefined(env) };
122 };
123
124 std::string procedureName = "NotifyDataChange";
125 auto asyncWork = GetPromiseOrCallBackWork(env, funcArg, static_cast<size_t>(NARG_CNT::THREE));
126 return asyncWork == nullptr ? nullptr : asyncWork->Schedule(procedureName, cbExec, cbComplete).val_;
127 }
128
IsNotifyEventChange(napi_env env,NFuncArg & funcArg)129 static bool IsNotifyEventChange(napi_env env, NFuncArg &funcArg)
130 {
131 auto options = NVal(env, funcArg[NARG_POS::SECOND]);
132 if (options.TypeIs(napi_object)) {
133 return true;
134 }
135 return false;
136 }
137
NotifyEventChange(napi_env env,NFuncArg & funcArg)138 napi_value NotifyEventChange(napi_env env, NFuncArg &funcArg)
139 {
140 LOGI("NotifyEventChange entrance");
141 bool succ = false;
142 int32_t userId;
143 tie(succ, userId) = NVal(env, funcArg[(int)NARG_POS::FIRST]).ToInt32();
144 if (!succ) {
145 NError(E_PARAMS).ThrowErr(env);
146 return nullptr;
147 }
148
149 auto argv = NVal(env, funcArg[NARG_POS::SECOND]);
150 if (!argv.HasProp("eventId") || !argv.HasProp("extraData")) {
151 NError(E_PARAMS).ThrowErr(env);
152 return nullptr;
153 }
154
155 std::unique_ptr<char []> eventId;
156 std::unique_ptr<char []> extraData;
157
158 tie(succ, eventId, std::ignore) = argv.GetProp("eventId").ToUTF8String();
159 if (!succ) {
160 NError(E_PARAMS).ThrowErr(env);
161 return nullptr;
162 }
163 tie(succ, extraData, std::ignore) = argv.GetProp("extraData").ToUTF8String();
164 if (!succ) {
165 NError(E_PARAMS).ThrowErr(env);
166 return nullptr;
167 }
168
169 string eventIdStr(eventId.get());
170 string extraDataStr(extraData.get());
171
172 auto cbExec = [userId, eventIdStr, extraDataStr]() -> NError {
173 int32_t result = CloudSyncManager::GetInstance().NotifyEventChange(userId, eventIdStr, extraDataStr);
174 if (result == E_PERMISSION_DENIED || result == E_PERMISSION_SYSTEM) {
175 return result == E_PERMISSION_DENIED? NError(Convert2JsErrNum(E_PERMISSION_DENIED)) :
176 NError(Convert2JsErrNum(E_PERMISSION_SYSTEM));
177 }
178 return NError(ERRNO_NOERR);
179 };
180 auto cbComplete = [](napi_env env, NError err) -> NVal {
181 if (err) {
182 return { env, err.GetNapiErr(env) };
183 }
184 return { NVal::CreateUndefined(env) };
185 };
186
187 std::string procedureName = "NotifyEventChange";
188 auto asyncWork = GetPromiseOrCallBackWork(env, funcArg, static_cast<size_t>(NARG_CNT::THREE));
189 return asyncWork == nullptr ? nullptr : asyncWork->Schedule(procedureName, cbExec, cbComplete).val_;
190 }
191
NotifyDataChange(napi_env env,napi_callback_info info)192 napi_value NotifyDataChange(napi_env env, napi_callback_info info)
193 {
194 LOGI("NotifyDataChange entrance");
195 NFuncArg funcArg(env, info);
196 if (!funcArg.InitArgs(static_cast<size_t>(NARG_CNT::TWO), static_cast<size_t>(NARG_CNT::THREE))) {
197 NError(E_PARAMS).ThrowErr(env, "Number of arguments unmatched");
198 return nullptr;
199 }
200
201 if (IsNotifyEventChange(env, funcArg)) {
202 return NotifyEventChange(env, funcArg);
203 }
204 return NotifyDataChangeInner(env, funcArg);
205 }
206
DisableCloud(napi_env env,napi_callback_info info)207 napi_value DisableCloud(napi_env env, napi_callback_info info)
208 {
209 LOGI("DisableCloud");
210 NFuncArg funcArg(env, info);
211 if (!funcArg.InitArgs(static_cast<size_t>(NARG_CNT::ONE), static_cast<size_t>(NARG_CNT::TWO))) {
212 NError(E_PARAMS).ThrowErr(env, "Number of arguments unmatched");
213 return nullptr;
214 }
215
216 bool succ = false;
217 std::unique_ptr<char []> accoutId;
218
219 tie(succ, accoutId, std::ignore) = NVal(env, funcArg[(int)NARG_POS::FIRST]).ToUTF8String();
220 if (!succ) {
221 NError(E_PARAMS).ThrowErr(env);
222 return nullptr;
223 }
224
225 string accoutIdStr(accoutId.get());
226
227 auto cbExec = [accoutIdStr]() -> NError {
228 int32_t result = CloudSyncManager::GetInstance().DisableCloud(accoutIdStr);
229 if (result == E_PERMISSION_DENIED || result == E_PERMISSION_SYSTEM) {
230 return result == E_PERMISSION_DENIED? NError(Convert2JsErrNum(E_PERMISSION_DENIED)) :
231 NError(Convert2JsErrNum(E_PERMISSION_SYSTEM));
232 }
233 return NError(ERRNO_NOERR);
234 };
235 auto cbComplete = [](napi_env env, NError err) -> NVal {
236 if (err) {
237 return { env, err.GetNapiErr(env) };
238 }
239 return { NVal::CreateUndefined(env) };
240 };
241
242 std::string procedureName = "DisableCloud";
243 auto asyncWork = GetPromiseOrCallBackWork(env, funcArg, static_cast<size_t>(NARG_CNT::TWO));
244 return asyncWork == nullptr ? nullptr : asyncWork->Schedule(procedureName, cbExec, cbComplete).val_;
245 }
246
247
ParseSwitches(napi_env env,napi_value object,SwitchDataObj & data)248 bool ParseSwitches(napi_env env, napi_value object, SwitchDataObj &data)
249 {
250 napi_valuetype valueType = napi_undefined;
251 napi_typeof(env, object, &valueType);
252 if (valueType != napi_object) {
253 LOGE("ParseSwitches failed, not napi object");
254 return false;
255 }
256 napi_value bundleNameArr = nullptr;
257 napi_get_property_names(env, object, &bundleNameArr);
258 uint32_t bundleNameNum = 0;
259 napi_get_array_length(env, bundleNameArr, &bundleNameNum);
260 for (uint32_t i = 0; i < bundleNameNum; ++i) {
261 napi_value item = nullptr;
262 napi_get_element(env, bundleNameArr, i, &item);
263 std::unique_ptr<char []> bundleId;
264 bool succ = false;
265 tie(succ, bundleId, std::ignore) = NVal(env, item).ToUTF8String();
266 if (!succ) {
267 LOGE("fail to get string");
268 return false;
269 }
270
271 napi_value val = nullptr;
272 napi_get_named_property(env, object, bundleId.get(), &val);
273 bool switchVal = false;
274 tie(succ, switchVal) = NVal(env, val).ToBool();
275 if (!succ) {
276 LOGE("fail to get switchVal");
277 return false;
278 }
279 data.switchData.emplace(bundleId.get(), switchVal);
280 }
281 return true;
282 }
283
EnableCloud(napi_env env,napi_callback_info info)284 napi_value EnableCloud(napi_env env, napi_callback_info info)
285 {
286 LOGI("EnableCloud");
287 NFuncArg funcArg(env, info);
288 if (!funcArg.InitArgs(static_cast<size_t>(NARG_CNT::TWO), static_cast<size_t>(NARG_CNT::THREE))) {
289 NError(E_PARAMS).ThrowErr(env, "Number of arguments unmatched");
290 return nullptr;
291 }
292
293 bool succ = false;
294 std::unique_ptr<char []> accoutId;
295
296 tie(succ, accoutId, std::ignore) = NVal(env, funcArg[(int)NARG_POS::FIRST]).ToUTF8String();
297 if (!succ) {
298 NError(E_PARAMS).ThrowErr(env);
299 return nullptr;
300 }
301 SwitchDataObj switchData;
302 if (!ParseSwitches(env, funcArg[(int)NARG_POS::SECOND], switchData)) {
303 NError(E_PARAMS).ThrowErr(env);
304 return nullptr;
305 }
306
307 string accoutIdStr(accoutId.get());
308
309 auto cbExec = [accoutIdStr, switchData]() -> NError {
310 int32_t result = CloudSyncManager::GetInstance().EnableCloud(accoutIdStr, switchData);
311 if (result == E_PERMISSION_DENIED || result == E_PERMISSION_SYSTEM) {
312 return result == E_PERMISSION_DENIED? NError(Convert2JsErrNum(E_PERMISSION_DENIED)) :
313 NError(Convert2JsErrNum(E_PERMISSION_SYSTEM));
314 }
315 return NError(ERRNO_NOERR);
316 };
317 auto cbComplete = [](napi_env env, NError err) -> NVal {
318 if (err) {
319 return { env, err.GetNapiErr(env) };
320 }
321 return { NVal::CreateUndefined(env) };
322 };
323
324 std::string procedureName = "EnableCloud";
325 auto asyncWork = GetPromiseOrCallBackWork(env, funcArg, static_cast<size_t>(NARG_CNT::THREE));
326 return asyncWork == nullptr ? nullptr : asyncWork->Schedule(procedureName, cbExec, cbComplete).val_;
327 }
328
ParseAppActions(napi_env env,napi_value object,CleanOptions & cleanOptions)329 bool ParseAppActions(napi_env env, napi_value object, CleanOptions &cleanOptions)
330 {
331 napi_valuetype valueType = napi_undefined;
332 napi_typeof(env, object, &valueType);
333 if (valueType != napi_object) {
334 LOGE("ParseAppActions failed, not napi object");
335 return false;
336 }
337 napi_value bundleNameArr = nullptr;
338 napi_get_property_names(env, object, &bundleNameArr);
339 uint32_t bundleNameNum = 0;
340 napi_get_array_length(env, bundleNameArr, &bundleNameNum);
341 for (uint32_t i = 0; i < bundleNameNum; ++i) {
342 napi_value item = nullptr;
343 napi_get_element(env, bundleNameArr, i, &item);
344 std::unique_ptr<char[]> bundleNameStr = nullptr;
345 bool resGetKey = false;
346 tie(resGetKey, bundleNameStr, ignore) = NVal(env, item).ToUTF8String();
347 if (!resGetKey) {
348 LOGE("Fail to get string");
349 return false;
350 }
351 napi_value actionObj = nullptr;
352 napi_get_named_property(env, object, bundleNameStr.get(), &actionObj);
353 int appActionsVal = 0;
354 bool resGetValue = false;
355 tie(resGetValue, appActionsVal) = NVal(env, actionObj).ToInt32();
356 if (!resGetValue) {
357 LOGE("Fail to get appActionsVal");
358 return false;
359 }
360 cleanOptions.appActionsData.emplace(string(bundleNameStr.get()).c_str(), appActionsVal);
361 }
362 return true;
363 }
Clean(napi_env env,napi_callback_info info)364 napi_value Clean(napi_env env, napi_callback_info info)
365 {
366 LOGI("Clean");
367 NFuncArg funcArg(env, info);
368 if (!funcArg.InitArgs(static_cast<size_t>(NARG_CNT::TWO), static_cast<size_t>(NARG_CNT::THREE))) {
369 NError(E_PARAMS).ThrowErr(env, "Number of arguments unmatched");
370 return nullptr;
371 }
372 std::unique_ptr<char []> accoutId = nullptr;
373 bool succ = false;
374 tie(succ, accoutId, ignore) = NVal(env, funcArg[(int)NARG_POS::FIRST]).ToUTF8String();
375 if (!succ) {
376 NError(E_PARAMS).ThrowErr(env);
377 return nullptr;
378 }
379 CleanOptions cleanOptions {};
380 if (!ParseAppActions(env, funcArg[(int)NARG_POS::SECOND], cleanOptions)) {
381 NError(E_PARAMS).ThrowErr(env);
382 return nullptr;
383 }
384
385 std::string accoutIdStr(accoutId.get());
386 auto cbExec = [accoutIdStr, cleanOptions]() -> NError {
387 int32_t result = CloudSyncManager::GetInstance().Clean(accoutIdStr, cleanOptions);
388 if (result == E_PERMISSION_DENIED || result == E_PERMISSION_SYSTEM) {
389 return result == E_PERMISSION_DENIED? NError(Convert2JsErrNum(E_PERMISSION_DENIED)) :
390 NError(Convert2JsErrNum(E_PERMISSION_SYSTEM));
391 }
392 return NError(ERRNO_NOERR);
393 };
394 auto cbComplete = [](napi_env env, NError err) -> NVal {
395 if (err) {
396 return { env, err.GetNapiErr(env) };
397 }
398 return { NVal::CreateUndefined(env) };
399 };
400
401 std::string procedureName = "Clean";
402 auto asyncWork = GetPromiseOrCallBackWork(env, funcArg, static_cast<size_t>(NARG_CNT::THREE));
403 return asyncWork == nullptr ? nullptr : asyncWork->Schedule(procedureName, cbExec, cbComplete).val_;
404 }
405
406 } // namespace OHOS::FileManagement::CloudSync
407