• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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