• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2024 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 "napi_os_account_common.h"
17 #include <string>
18 #include "napi_account_error.h"
19 #include "napi_account_common.h"
20 #include "napi/native_common.h"
21 #include "napi_os_account.h"
22 
23 namespace OHOS {
24 namespace AccountJsKit {
25 constexpr int32_t COMPATIBILITY_CHANGE_VERSION_API12 = 12;
NapiCreateDomainCallback(napi_env env,napi_ref callbackRef,napi_deferred deferred)26 NapiCreateDomainCallback::NapiCreateDomainCallback(napi_env env, napi_ref callbackRef, napi_deferred deferred)
27     : env_(env), callbackRef_(callbackRef), deferred_(deferred)
28 {}
29 
~NapiCreateDomainCallback()30 NapiCreateDomainCallback::~NapiCreateDomainCallback()
31 {
32     std::unique_lock<std::mutex> lock(lockInfo_.mutex);
33     if (callbackRef_ != nullptr) {
34         ReleaseNapiRefAsync(env_, callbackRef_);
35         callbackRef_ = nullptr;
36     }
37 }
38 
OnResult(const int32_t errCode,Parcel & parcel)39 void NapiCreateDomainCallback::OnResult(const int32_t errCode, Parcel &parcel)
40 {
41     std::shared_ptr<OsAccountInfo> osAccountInfo(OsAccountInfo::Unmarshalling(parcel));
42     if (osAccountInfo == nullptr) {
43         ACCOUNT_LOGE("failed to unmarshalling OsAccountInfo");
44         return;
45     }
46     std::unique_lock<std::mutex> lock(lockInfo_.mutex);
47     if ((callbackRef_ == nullptr) && (deferred_ == nullptr)) {
48         ACCOUNT_LOGE("js callback is nullptr");
49         return;
50     }
51     auto asyncContext = std::make_shared<CreateOAForDomainAsyncContext>();
52     asyncContext->osAccountInfos = *osAccountInfo;
53     asyncContext->errCode = errCode;
54     asyncContext->env = env_;
55     asyncContext->callbackRef = callbackRef_;
56     asyncContext->deferred = deferred_;
57     // transfer control of callbackRef & deferred to asyncContext, they would be released in async context
58     callbackRef_ = nullptr;
59     deferred_ = nullptr;
60     if (napi_ok != napi_send_event(env_, CreateOAForDomainCallbackCompletedWork(asyncContext), napi_eprio_vip)) {
61         ACCOUNT_LOGE("Post task failed");
62         return;
63     }
64     ACCOUNT_LOGI("Post task finish");
65 }
66 
WrapVoidToJS(napi_env env)67 napi_value WrapVoidToJS(napi_env env)
68 {
69     napi_value result = nullptr;
70     NAPI_CALL(env, napi_get_null(env, &result));
71     return result;
72 }
73 
ParseOneParaContext(napi_env env,napi_callback_info cbInfo,CommonAsyncContext * asyncContext)74 static bool ParseOneParaContext(napi_env env, napi_callback_info cbInfo, CommonAsyncContext *asyncContext)
75 {
76     size_t argc = ARGS_SIZE_ONE;
77     napi_value argv[ARGS_SIZE_ONE] = {0};
78     napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
79     if (argc >= ARGS_SIZE_ONE) {
80         if (!GetCallbackProperty(env, argv[PARAMZERO], asyncContext->callbackRef, 1)) {
81             ACCOUNT_LOGE("Get callbackRef failed");
82             std::string errMsg = "Parameter error. The type of \"callback\" must be function";
83             AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
84             return false;
85         }
86     }
87     return true;
88 }
89 
ParseCallbackAndId(napi_env env,napi_callback_info cbInfo,napi_ref & callbackRef,int & id,bool throwErr)90 bool ParseCallbackAndId(napi_env env, napi_callback_info cbInfo, napi_ref &callbackRef, int &id, bool throwErr)
91 {
92     size_t argc = ARGS_SIZE_TWO;
93     napi_value argv[ARGS_SIZE_TWO] = {0};
94     napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
95 
96     if (argc == ARGS_SIZE_TWO) {
97         if (!GetCallbackProperty(env, argv[argc - 1], callbackRef, 1)) {
98             ACCOUNT_LOGE("Get callbackRef failed");
99             std::string errMsg = "Parameter error. The type of \"callback\" must be function";
100             AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, throwErr);
101             return false;
102         }
103     }
104     if (!GetIntProperty(env, argv[PARAMZERO], id)) {
105         ACCOUNT_LOGE("Get id failed");
106         std::string errMsg = "Parameter error. The type of \"localId\" must be number";
107         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, throwErr);
108         return false;
109     }
110     return true;
111 }
112 
ParseParaDeactivateOA(napi_env env,napi_callback_info cbInfo,ActivateOAAsyncContext * asyncContext)113 bool ParseParaDeactivateOA(napi_env env, napi_callback_info cbInfo, ActivateOAAsyncContext *asyncContext)
114 {
115     size_t argc = ARGS_SIZE_ONE;
116     napi_value argv[ARGS_SIZE_ONE] = {0};
117     NAPI_CALL_BASE(env, napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr), false);
118 
119     if (argc < ARGS_SIZE_ONE) {
120         ACCOUNT_LOGE("The number of parameters should be at least 1.");
121         std::string errMsg = "The number of parameters should be at least 1";
122         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, true);
123         return false;
124     }
125     if (!GetIntProperty(env, argv[PARAMZERO], asyncContext->id)) {
126         ACCOUNT_LOGE("Get local Id failed.");
127         std::string errMsg = "The type of first arg must be number";
128         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, true);
129         return false;
130     }
131     return true;
132 }
133 
DeactivateOAExecuteCB(napi_env env,void * data)134 void DeactivateOAExecuteCB(napi_env env, void *data)
135 {
136     ActivateOAAsyncContext *asyncContext = reinterpret_cast<ActivateOAAsyncContext *>(data);
137     asyncContext->errCode = OsAccountManager::DeactivateOsAccount(asyncContext->id);
138 }
139 
DeactivateOACompletedCB(napi_env env,napi_status status,void * data)140 void DeactivateOACompletedCB(napi_env env, napi_status status, void *data)
141 {
142     ActivateOAAsyncContext *asyncContext = reinterpret_cast<ActivateOAAsyncContext *>(data);
143     std::unique_ptr<ActivateOAAsyncContext> asyncContextPtr{asyncContext};
144     napi_value errJs = nullptr;
145     napi_value dataJs = nullptr;
146     if (asyncContext->errCode == ERR_OK) {
147         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &dataJs));
148     } else {
149         errJs = GenerateBusinessError(env, asyncContext->errCode);
150     }
151     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
152 }
153 
ParseParaQueryOAByIdCB(napi_env env,napi_callback_info cbInfo,QueryOAByIdAsyncContext * asyncContext)154 bool ParseParaQueryOAByIdCB(napi_env env, napi_callback_info cbInfo, QueryOAByIdAsyncContext *asyncContext)
155 {
156     return ParseCallbackAndId(env, cbInfo, asyncContext->callbackRef, asyncContext->id, asyncContext->throwErr);
157 }
158 
QueryOAByIdExecuteCB(napi_env env,void * data)159 void QueryOAByIdExecuteCB(napi_env env, void *data)
160 {
161     QueryOAByIdAsyncContext *asyncContext = reinterpret_cast<QueryOAByIdAsyncContext *>(data);
162     asyncContext->errCode = OsAccountManager::QueryOsAccountById(asyncContext->id, asyncContext->osAccountInfos);
163     ACCOUNT_LOGD("errcode is %{public}d", asyncContext->errCode);
164     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
165 }
166 
QueryOAByIdCallbackCompletedCB(napi_env env,napi_status status,void * data)167 void QueryOAByIdCallbackCompletedCB(napi_env env, napi_status status, void *data)
168 {
169     QueryOAByIdAsyncContext *asyncContext = reinterpret_cast<QueryOAByIdAsyncContext *>(data);
170     napi_value errJs = nullptr;
171     napi_value dataJs = nullptr;
172     if (asyncContext->status == napi_ok) {
173         napi_get_null(env, &errJs);
174         GetOACBInfoToJs(env, asyncContext->osAccountInfos, dataJs);
175     } else {
176         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
177         napi_get_null(env, &dataJs);
178     }
179     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
180     delete asyncContext;
181 }
182 
CreateJsDomainInfo(napi_env env,const DomainAccountInfo & info,napi_value & result)183 void CreateJsDomainInfo(napi_env env, const DomainAccountInfo &info, napi_value &result)
184 {
185     napi_create_object(env, &result);
186     napi_value value = nullptr;
187     // domain
188     napi_create_string_utf8(env, info.domain_.c_str(), info.domain_.size(), &value);
189     napi_set_named_property(env, result, "domain", value);
190 
191     // domain accountName
192     napi_create_string_utf8(env, info.accountName_.c_str(), info.accountName_.size(), &value);
193     napi_set_named_property(env, result, "accountName", value);
194 
195     napi_create_string_utf8(env, info.accountId_.c_str(), info.accountId_.size(), &value);
196     napi_set_named_property(env, result, "accountId", value);
197     if ((info.status_ == DomainAccountStatus::LOGOUT) || (info.status_ >= DomainAccountStatus::LOG_END)) {
198         napi_get_boolean(env, false, &value);
199     } else {
200         napi_get_boolean(env, true, &value);
201     }
202     napi_set_named_property(env, result, "isAuthenticated", value);
203 
204     //serverConfigId
205     napi_create_string_utf8(env, info.serverConfigId_.c_str(), info.serverConfigId_.size(), &value);
206     napi_set_named_property(env, result, "serverConfigId", value);
207 }
208 
CreateJsDistributedInfo(napi_env env,const OhosAccountInfo & info,napi_value & result)209 void CreateJsDistributedInfo(napi_env env, const OhosAccountInfo &info, napi_value &result)
210 {
211     napi_create_object(env, &result);
212     napi_value value = nullptr;
213     // name
214     napi_create_string_utf8(env, info.name_.c_str(), info.name_.size(), &value);
215     napi_set_named_property(env, result, "name", value);
216 
217     // id
218     napi_create_string_utf8(env, info.uid_.c_str(), info.uid_.size(), &value);
219     napi_set_named_property(env, result, "id", value);
220 
221     // event
222     napi_create_string_utf8(env, "", 0, &value);
223     napi_set_named_property(env, result, "event", value);
224 
225     // scalableData
226     napi_value scalable = nullptr;
227     napi_create_object(env, &scalable);
228     napi_set_named_property(env, result, "scalableData", scalable);
229 }
230 
GetOACBInfoToJs(napi_env env,OsAccountInfo & info,napi_value & objOAInfo)231 void GetOACBInfoToJs(napi_env env, OsAccountInfo &info, napi_value &objOAInfo)
232 {
233     napi_create_object(env, &objOAInfo);
234     napi_value idToJs = nullptr;
235     napi_create_int32(env, info.GetLocalId(), &idToJs);
236     napi_set_named_property(env, objOAInfo, "localId", idToJs);
237 
238     napi_value nameToJs = nullptr;
239     napi_create_string_utf8(env, info.GetLocalName().c_str(), NAPI_AUTO_LENGTH, &nameToJs);
240     napi_set_named_property(env, objOAInfo, "localName", nameToJs);
241 
242     napi_value shortNameToJs = nullptr;
243     napi_create_string_utf8(env, info.GetShortName().c_str(), NAPI_AUTO_LENGTH, &shortNameToJs);
244     napi_set_named_property(env, objOAInfo, "shortName", shortNameToJs);
245 
246     napi_value typeToJsObj = nullptr;
247     napi_create_int32(env, static_cast<int>(info.GetType()), &typeToJsObj);
248     napi_set_named_property(env, objOAInfo, "type", typeToJsObj);
249 
250     napi_value constraintsToJs = nullptr;
251     napi_create_array(env, &constraintsToJs);
252     MakeArrayToJs(env, info.GetConstraints(), constraintsToJs);
253     napi_set_named_property(env, objOAInfo, "constraints", constraintsToJs);
254 
255     napi_value isVerifiedToJs = nullptr;
256     napi_get_boolean(env, info.GetIsVerified(), &isVerifiedToJs);
257     napi_set_named_property(env, objOAInfo, "isVerified", isVerifiedToJs);
258     napi_set_named_property(env, objOAInfo, "isUnlocked", isVerifiedToJs);
259 
260     napi_value photoToJs = nullptr;
261     napi_create_string_utf8(env, info.GetPhoto().c_str(), NAPI_AUTO_LENGTH, &photoToJs);
262     napi_set_named_property(env, objOAInfo, "photo", photoToJs);
263 
264     napi_value createTimeToJs = nullptr;
265     napi_create_int64(env, info.GetCreateTime(), &createTimeToJs);
266     napi_set_named_property(env, objOAInfo, "createTime", createTimeToJs);
267 
268     napi_value lastLoginTimeToJs = nullptr;
269     napi_create_int64(env, info.GetLastLoginTime(), &lastLoginTimeToJs);
270     napi_set_named_property(env, objOAInfo, "lastLoginTime", lastLoginTimeToJs);
271 
272     napi_value serialNumberToJs = nullptr;
273     napi_create_int64(env, info.GetSerialNumber(), &serialNumberToJs);
274     napi_set_named_property(env, objOAInfo, "serialNumber", serialNumberToJs);
275 
276     napi_value isActivedToJs = nullptr;
277     napi_get_boolean(env, info.GetIsActived(), &isActivedToJs);
278     napi_set_named_property(env, objOAInfo, "isActived", isActivedToJs);
279     napi_set_named_property(env, objOAInfo, "isActivated", isActivedToJs);
280 
281     napi_value isLoggedInToJs = nullptr;
282     napi_get_boolean(env, info.GetIsLoggedIn(), &isLoggedInToJs);
283     napi_set_named_property(env, objOAInfo, "isLoggedIn", isLoggedInToJs);
284 
285     napi_value isCreateCompletedToJs = nullptr;
286     napi_get_boolean(env, info.GetIsCreateCompleted(), &isCreateCompletedToJs);
287     napi_set_named_property(env, objOAInfo, "isCreateCompleted", isCreateCompletedToJs);
288 
289     GetOtherAccountInfoToJs(env, info, objOAInfo);
290 }
291 
GetOtherAccountInfoToJs(napi_env env,OsAccountInfo & info,napi_value & objOAInfo)292 void GetOtherAccountInfoToJs(napi_env env, OsAccountInfo &info, napi_value &objOAInfo)
293 {
294     // distributedInfo: distributedAccount.DistributedInfo
295     napi_value dbInfoToJs = nullptr;
296     std::pair<bool, OhosAccountInfo> dbAccountInfo = OhosAccountKits::GetInstance().QueryOhosAccountInfo();
297     if (dbAccountInfo.first) {
298         CreateJsDistributedInfo(env, dbAccountInfo.second, dbInfoToJs);
299     }
300     napi_set_named_property(env, objOAInfo, "distributedInfo", dbInfoToJs);
301 
302     // domainInfo: domainInfo.DomainAccountInfo
303     DomainAccountInfo domainInfo;
304     info.GetDomainInfo(domainInfo);
305     CreateJsDomainInfo(env, domainInfo, dbInfoToJs);
306     napi_set_named_property(env, objOAInfo, "domainInfo", dbInfoToJs);
307 }
308 
MakeArrayToJs(napi_env env,const std::vector<std::string> & constraints,napi_value jsArray)309 void MakeArrayToJs(napi_env env, const std::vector<std::string> &constraints, napi_value jsArray)
310 {
311     uint32_t index = 0;
312 
313     for (auto item : constraints) {
314         napi_value constraint = nullptr;
315         napi_create_string_utf8(env, item.c_str(), NAPI_AUTO_LENGTH, &constraint);
316         napi_set_element(env, jsArray, index, constraint);
317         index++;
318     }
319 }
320 
ParseParaRemoveOACB(napi_env env,napi_callback_info cbInfo,RemoveOAAsyncContext * asyncContext)321 bool ParseParaRemoveOACB(napi_env env, napi_callback_info cbInfo, RemoveOAAsyncContext *asyncContext)
322 {
323     return ParseCallbackAndId(env, cbInfo, asyncContext->callbackRef, asyncContext->id, asyncContext->throwErr);
324 }
325 
RemoveOAExecuteCB(napi_env env,void * data)326 void RemoveOAExecuteCB(napi_env env, void *data)
327 {
328     RemoveOAAsyncContext *asyncContext = reinterpret_cast<RemoveOAAsyncContext *>(data);
329     asyncContext->errCode = OsAccountManager::RemoveOsAccount(asyncContext->id);
330     ACCOUNT_LOGD("errcode is %{public}d", asyncContext->errCode);
331     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
332 }
333 
RemoveOACallbackCompletedCB(napi_env env,napi_status status,void * data)334 void RemoveOACallbackCompletedCB(napi_env env, napi_status status, void *data)
335 {
336     ACCOUNT_LOGD("napi_create_async_work complete");
337     RemoveOAAsyncContext *asyncContext = reinterpret_cast<RemoveOAAsyncContext *>(data);
338     napi_value errJs = nullptr;
339     napi_value dataJs = nullptr;
340     if (asyncContext->status == napi_ok) {
341         napi_get_null(env, &errJs);
342         napi_get_null(env, &dataJs);
343     } else {
344         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
345         napi_get_null(env, &dataJs);
346     }
347     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
348     delete asyncContext;
349 }
350 
ParseParaSetOAName(napi_env env,napi_callback_info cbInfo,SetOANameAsyncContext * asyncContext)351 bool ParseParaSetOAName(napi_env env, napi_callback_info cbInfo, SetOANameAsyncContext *asyncContext)
352 {
353     size_t argc = ARGS_SIZE_THREE;
354     napi_value argv[ARGS_SIZE_THREE] = {0};
355     napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
356 
357     if (argc == ARGS_SIZE_THREE) {
358         if (!GetCallbackProperty(env, argv[argc - 1], asyncContext->callbackRef, 1)) {
359             ACCOUNT_LOGE("Get SetOAName callbackRef failed");
360             std::string errMsg = "The type of arg " + std::to_string(argc) + " must be function";
361             AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
362             return false;
363         }
364     }
365 
366     if (!GetIntProperty(env, argv[PARAMZERO], asyncContext->id)) {
367         ACCOUNT_LOGE("Get id failed");
368         std::string errMsg = "The type of arg 1 must be number";
369         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
370         return false;
371     }
372     if (!GetStringProperty(env, argv[PARAMONE], asyncContext->name)) {
373         ACCOUNT_LOGE("Get name failed");
374         std::string errMsg = "The type of arg 2 must be string";
375         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
376         return false;
377     }
378 
379     return true;
380 }
381 
SetOANameExecuteCB(napi_env env,void * data)382 void SetOANameExecuteCB(napi_env env, void *data)
383 {
384     SetOANameAsyncContext *asyncContext = reinterpret_cast<SetOANameAsyncContext *>(data);
385     asyncContext->errCode = OsAccountManager::SetOsAccountName(asyncContext->id, asyncContext->name);
386     ACCOUNT_LOGD("errcode is %{public}d", asyncContext->errCode);
387     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
388 }
389 
SetOANameCallbackCompletedCB(napi_env env,napi_status status,void * data)390 void SetOANameCallbackCompletedCB(napi_env env, napi_status status, void *data)
391 {
392     ACCOUNT_LOGD("napi_create_async_work complete");
393     SetOANameAsyncContext *asyncContext = reinterpret_cast<SetOANameAsyncContext *>(data);
394     napi_value errJs = nullptr;
395     napi_value dataJs = nullptr;
396     if (asyncContext->status == napi_ok) {
397         napi_get_null(env, &errJs);
398         napi_get_null(env, &dataJs);
399     } else {
400         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
401         napi_get_null(env, &dataJs);
402     }
403     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
404     delete asyncContext;
405 }
406 
ParseParaSetOAConstraints(napi_env env,napi_callback_info cbInfo,SetOAConsAsyncContext * asyncContext)407 bool ParseParaSetOAConstraints(napi_env env, napi_callback_info cbInfo, SetOAConsAsyncContext *asyncContext)
408 {
409     size_t argc = ARGS_SIZE_FOUR;
410     napi_value argv[ARGS_SIZE_FOUR] = {0};
411     NAPI_CALL_BASE(env, napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr), false);
412 
413     // argv[3] : callback
414     if (argc == ARGS_SIZE_FOUR) {
415         if (!GetCallbackProperty(env, argv[argc - 1], asyncContext->callbackRef, 1)) {
416             ACCOUNT_LOGE("Get callbackRef failed");
417             std::string errMsg = "The type of arg " + std::to_string(argc) + " must be function";
418             AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
419             return false;
420         }
421     }
422 
423     // argv[0] : localId
424     if (!GetIntProperty(env, argv[PARAMZERO], asyncContext->id)) {
425         ACCOUNT_LOGE("Get id failed");
426         std::string errMsg = "The type of arg 1 must be number";
427         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
428         return false;
429     }
430 
431     // argv[1] : Array<string>
432     if (!GetStringArrayProperty(env, argv[PARAMONE], asyncContext->constraints, false)) {
433         ACCOUNT_LOGE("Get constraints failed, expected array of strings");
434         std::string errMsg = "The type of arg 2 must be unempty array of strings";
435         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, true);
436         return false;
437     }
438 
439     // argv[2] : enable
440     if (!GetBoolProperty(env, argv[PARAMTWO], asyncContext->enable)) {
441         ACCOUNT_LOGE("Get enable failed");
442         std::string errMsg = "The type of arg 3 must be boolean";
443         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, true);
444         return false;
445     }
446 
447     return true;
448 }
449 
SetOAConsExecuteCB(napi_env env,void * data)450 void SetOAConsExecuteCB(napi_env env, void *data)
451 {
452     SetOAConsAsyncContext *asyncContext = reinterpret_cast<SetOAConsAsyncContext *>(data);
453     asyncContext->errCode =
454         OsAccountManager::SetOsAccountConstraints(asyncContext->id, asyncContext->constraints, asyncContext->enable);
455     ACCOUNT_LOGD("errcode is %{public}d", asyncContext->errCode);
456     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
457 }
458 
SetOAConsCallbackCompletedCB(napi_env env,napi_status status,void * data)459 void SetOAConsCallbackCompletedCB(napi_env env, napi_status status, void *data)
460 {
461     ACCOUNT_LOGD("napi_create_async_work complete");
462     SetOAConsAsyncContext *asyncContext = reinterpret_cast<SetOAConsAsyncContext *>(data);
463     napi_value errJs = nullptr;
464     napi_value dataJs = nullptr;
465     if (asyncContext->status == napi_ok) {
466         napi_get_null(env, &errJs);
467         napi_get_null(env, &dataJs);
468     } else {
469         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
470         napi_get_null(env, &dataJs);
471     }
472     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
473     delete asyncContext;
474 }
475 
ParseParaActiveOA(napi_env env,napi_callback_info cbInfo,ActivateOAAsyncContext * asyncContext)476 bool ParseParaActiveOA(napi_env env, napi_callback_info cbInfo, ActivateOAAsyncContext *asyncContext)
477 {
478     return ParseCallbackAndId(env, cbInfo, asyncContext->callbackRef, asyncContext->id, asyncContext->throwErr);
479 }
480 
ActivateOAExecuteCB(napi_env env,void * data)481 void ActivateOAExecuteCB(napi_env env, void *data)
482 {
483     ActivateOAAsyncContext *activateOACB = reinterpret_cast<ActivateOAAsyncContext *>(data);
484     activateOACB->errCode = OsAccountManager::ActivateOsAccount(activateOACB->id);
485     ACCOUNT_LOGD("errcode is %{public}d", activateOACB->errCode);
486     activateOACB->status = (activateOACB->errCode == 0) ? napi_ok : napi_generic_failure;
487 }
488 
ActivateOACallbackCompletedCB(napi_env env,napi_status status,void * data)489 void ActivateOACallbackCompletedCB(napi_env env, napi_status status, void *data)
490 {
491     ACCOUNT_LOGD("napi_create_async_work complete");
492     ActivateOAAsyncContext *asyncContext = reinterpret_cast<ActivateOAAsyncContext *>(data);
493     napi_value errJs = nullptr;
494     napi_value dataJs = nullptr;
495     if (asyncContext->status == napi_ok) {
496         napi_get_null(env, &errJs);
497         napi_get_null(env, &dataJs);
498     } else {
499         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
500         napi_get_null(env, &dataJs);
501     }
502     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
503     delete asyncContext;
504 }
505 
ParseParaCreateOA(napi_env env,napi_callback_info cbInfo,CreateOAAsyncContext * asyncContext)506 bool ParseParaCreateOA(napi_env env, napi_callback_info cbInfo, CreateOAAsyncContext *asyncContext)
507 {
508     size_t argc = ARGS_SIZE_THREE;
509     napi_value argv[ARGS_SIZE_THREE] = {0};
510     napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
511     if (argc == ARGS_SIZE_THREE) {
512         if (!GetCallbackProperty(env, argv[PARAMTWO], asyncContext->callbackRef, 1)) {
513             napi_has_named_property(env, argv[PARAMTWO], "shortName", &asyncContext->hasShortName);
514             if (asyncContext->hasShortName &&
515                 !GetStringPropertyByKey(env, argv[PARAMTWO], "shortName", asyncContext->shortName)) {
516                 ACCOUNT_LOGE("get CreateOsAccountOptions's shortName failed");
517                 std::string errMsg = "Parameter error. The type of arg 3 must be function or CreateOsAccountOptions";
518                 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
519                 return false;
520             }
521             bool hasDisallowedBundleNames = false;
522             napi_has_named_property(env, argv[PARAMTWO], "disallowedBundleNames", &hasDisallowedBundleNames);
523             if (hasDisallowedBundleNames) {
524                 GetStringArrayPropertyByKey(env, argv[PARAMTWO], "disallowedBundleNames",
525                     asyncContext->disallowedHapList, true);
526             } else {
527                 GetStringArrayPropertyByKey(env, argv[PARAMTWO], "disallowedPreinstalledBundles",
528                     asyncContext->disallowedHapList, true);
529             }
530             bool hasAllowedPreinstalledBundles = false;
531             napi_has_named_property(
532                 env, argv[PARAMTWO], "allowedPreinstalledBundles", &hasAllowedPreinstalledBundles);
533             if (hasAllowedPreinstalledBundles) {
534                 std::vector<std::string> list;
535                 GetStringArrayPropertyByKey(env, argv[PARAMTWO], "allowedPreinstalledBundles", list, true);
536                 asyncContext->allowedHapList = std::make_optional<std::vector<std::string>>(list);
537             }
538         }
539     }
540 
541     if (!GetStringProperty(env, argv[PARAMZERO], asyncContext->name)) {
542         ACCOUNT_LOGE("Get name failed");
543         std::string errMsg = "Parameter error. The type of \"localName\" must be string";
544         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
545         return false;
546     }
547 
548     int32_t type = 0;
549     if (!GetIntProperty(env, argv[PARAMONE], type)) {
550         ACCOUNT_LOGE("Get type failed");
551         std::string errMsg = "Parameter error. The type of \"type\" must be OsAccountType";
552         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
553         return false;
554     }
555 
556     asyncContext->type = static_cast<OsAccountType>(type);
557     return true;
558 }
559 
ParseDomainAccountInfo(napi_env env,napi_value object,DomainAccountInfo & info)560 static bool ParseDomainAccountInfo(napi_env env, napi_value object, DomainAccountInfo &info)
561 {
562     if (!GetStringPropertyByKey(env, object, "domain", info.domain_)) {
563         ACCOUNT_LOGE("get domainInfo's domain failed");
564         return false;
565     }
566     if (!GetStringPropertyByKey(env, object, "accountName", info.accountName_)) {
567         ACCOUNT_LOGE("get domainInfo's accountName failed");
568         return false;
569     }
570     bool hasProp = false;
571     napi_has_named_property(env, object, "accountId", &hasProp);
572     if (hasProp) {
573         napi_value value = nullptr;
574         napi_get_named_property(env, object, "accountId", &value);
575         napi_valuetype valueType = napi_undefined;
576         napi_typeof(env, value, &valueType);
577         if ((valueType == napi_undefined) || (valueType == napi_null)) {
578             ACCOUNT_LOGI("the accountId is undefined or null");
579         } else {
580             if (!GetStringProperty(env, value, info.accountId_)) {
581                 ACCOUNT_LOGE("get domainInfo's accountId failed");
582                 return false;
583             }
584         }
585     }
586     if (!GetOptionalStringPropertyByKey(env, object, "serverConfigId", info.serverConfigId_)) {
587         ACCOUNT_LOGE("Get domainInfo's serverConfigId failed");
588         return false;
589     }
590     return true;
591 }
592 
ParseDomainOptionInfo(napi_env env,napi_value object,CreateOsAccountForDomainOptions & domainOptions)593 static bool ParseDomainOptionInfo(napi_env env, napi_value object, CreateOsAccountForDomainOptions &domainOptions)
594 {
595     if (!GetStringPropertyByKey(env, object, "shortName", domainOptions.shortName)) {
596         ACCOUNT_LOGE("Failed to get options's shortName");
597         return false;
598     }
599     domainOptions.hasShortName = true;
600     return true;
601 }
602 
ParseParaCreateOAForDomain(napi_env env,napi_callback_info cbInfo,CreateOAForDomainAsyncContext * asyncContext)603 bool ParseParaCreateOAForDomain(napi_env env, napi_callback_info cbInfo,
604     CreateOAForDomainAsyncContext *asyncContext)
605 {
606     size_t argc = ARGS_SIZE_THREE;
607     napi_value argv[ARGS_SIZE_THREE] = {0};
608     napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
609 
610     napi_valuetype valueType = napi_undefined;
611     if (argc == ARGS_SIZE_THREE) {
612         napi_typeof(env, argv[ARGS_SIZE_TWO], &valueType);
613         if (!GetCallbackProperty(env, argv[PARAMTWO], asyncContext->callbackRef, 1)) {
614             if (!ParseDomainOptionInfo(env, argv[PARAMTWO], asyncContext->domainOptions)) {
615                 ACCOUNT_LOGE("Failed to get domainOptions");
616                 std::string errMsg =
617                     "Parameter error. The type of arg 3 must be function or CreateOsAccountForDomainOptions";
618                 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
619                 return false;
620             }
621         }
622     }
623 
624     int32_t id = 0;
625     if (!GetIntProperty(env, argv[PARAMZERO], id)) {
626         ACCOUNT_LOGE("Get type failed");
627         std::string errMsg = "Parameter error. The type of \"type\" must be OsAccountType";
628         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
629         return false;
630     }
631     asyncContext->type = static_cast<OsAccountType>(id);
632 
633     if (!ParseDomainAccountInfo(env, argv[PARAMONE], asyncContext->domainInfo)) {
634         ACCOUNT_LOGE("get domainInfo failed");
635         std::string errMsg = "Parameter error. The type of \"domainInfo\" must be DomainAccountInfo";
636         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
637         return false;
638     }
639     return true;
640 }
641 
CreateOAExecuteCB(napi_env env,void * data)642 void CreateOAExecuteCB(napi_env env, void *data)
643 {
644     ACCOUNT_LOGD("napi_create_async_work running");
645     CreateOAAsyncContext *asyncContext = reinterpret_cast<CreateOAAsyncContext *>(data);
646     CreateOsAccountOptions options;
647     options.shortName = asyncContext->shortName;
648     options.disallowedHapList = asyncContext->disallowedHapList;
649     options.allowedHapList = asyncContext->allowedHapList;
650     options.hasShortName = asyncContext->hasShortName;
651     asyncContext->errCode = OsAccountManager::CreateOsAccount(asyncContext->name, asyncContext->shortName,
652         asyncContext->type, options, asyncContext->osAccountInfos);
653     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
654 }
655 
CreateOAForDomainCompletedCB(napi_env env,napi_status status,void * data)656 void CreateOAForDomainCompletedCB(napi_env env, napi_status status, void *data)
657 {
658     delete reinterpret_cast<CreateOAForDomainAsyncContext *>(data);
659 }
660 
CreateOAForDomainExecuteCB(napi_env env,void * data)661 void CreateOAForDomainExecuteCB(napi_env env, void *data)
662 {
663     CreateOAForDomainAsyncContext *asyncContext = reinterpret_cast<CreateOAForDomainAsyncContext *>(data);
664     auto callback = std::make_shared<NapiCreateDomainCallback>(env, asyncContext->callbackRef, asyncContext->deferred);
665     asyncContext->errCode =
666         OsAccountManager::CreateOsAccountForDomain(asyncContext->type, asyncContext->domainInfo,
667             callback, asyncContext->domainOptions);
668     if (asyncContext->errCode != ERR_OK) {
669         Parcel emptyParcel;
670         callback->OnResult(asyncContext->errCode, emptyParcel);
671     }
672     asyncContext->callbackRef = nullptr;
673     asyncContext->deferred = nullptr;
674 }
675 
CreateOACallbackCompletedCB(napi_env env,napi_status status,void * data)676 void CreateOACallbackCompletedCB(napi_env env, napi_status status, void *data)
677 {
678     ACCOUNT_LOGD("napi_create_async_work complete");
679     CreateOAAsyncContext *asyncContext = reinterpret_cast<CreateOAAsyncContext *>(data);
680     napi_value errJs = nullptr;
681     napi_value dataJs = nullptr;
682     if (asyncContext->status == napi_ok) {
683         napi_get_null(env, &errJs);
684         GetOACBInfoToJs(env, asyncContext->osAccountInfos, dataJs);
685     } else {
686         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
687         napi_get_null(env, &dataJs);
688     }
689     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
690     delete asyncContext;
691 }
692 
CreateOAForDomainCallbackCompletedWork(std::shared_ptr<CreateOAForDomainAsyncContext> param)693 std::function<void()> CreateOAForDomainCallbackCompletedWork(std::shared_ptr<CreateOAForDomainAsyncContext> param)
694 {
695     return [asyncContext = std::move(param)] {
696         ACCOUNT_LOGI("Enter CreateOAForDomainCallbackCompletedWork");
697         napi_handle_scope scope = nullptr;
698         napi_open_handle_scope(asyncContext->env, &scope);
699         if (scope == nullptr) {
700             ACCOUNT_LOGE("Fail to open scope");
701             return;
702         }
703         napi_value errJs = nullptr;
704         napi_value dataJs = nullptr;
705         if (asyncContext->errCode == ERR_OK) {
706             GetOACBInfoToJs(asyncContext->env, asyncContext->osAccountInfos, dataJs);
707         } else {
708             errJs = GenerateBusinessError(asyncContext->env, asyncContext->errCode);
709         }
710         ReturnCallbackOrPromise(asyncContext->env, asyncContext.get(), errJs, dataJs);
711         napi_close_handle_scope(asyncContext->env, scope);
712     };
713 }
714 
ParseParaGetOACount(napi_env env,napi_callback_info cbInfo,GetOACountAsyncContext * asyncContext)715 bool ParseParaGetOACount(napi_env env, napi_callback_info cbInfo, GetOACountAsyncContext *asyncContext)
716 {
717     return ParseOneParaContext(env, cbInfo, asyncContext);
718 }
719 
GetOACountExecuteCB(napi_env env,void * data)720 void GetOACountExecuteCB(napi_env env, void *data)
721 {
722     GetOACountAsyncContext *asyncContext = reinterpret_cast<GetOACountAsyncContext *>(data);
723     asyncContext->errCode = OsAccountManager::GetCreatedOsAccountsCount(asyncContext->osAccountsCount);
724     // for compatibility
725     if ((!asyncContext->throwErr) && (asyncContext->errCode == ERR_ACCOUNT_COMMON_PERMISSION_DENIED)) {
726         asyncContext->errCode = ERR_OSACCOUNT_KIT_GET_CREATED_OS_ACCOUNT_COUNT_ERROR;
727     }
728     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
729 }
730 
GetOACountCallbackCompletedCB(napi_env env,napi_status status,void * data)731 void GetOACountCallbackCompletedCB(napi_env env, napi_status status, void *data)
732 {
733     ACCOUNT_LOGD("napi_create_async_work complete");
734     GetOACountAsyncContext *asyncContext = reinterpret_cast<GetOACountAsyncContext *>(data);
735     napi_value errJs = nullptr;
736     napi_value dataJs = nullptr;
737     if (asyncContext->status == napi_ok) {
738         errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
739         napi_create_uint32(env, asyncContext->osAccountsCount, &dataJs);
740     } else {
741         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
742         if (asyncContext->throwErr) {
743             napi_get_null(env, &dataJs);
744         } else {
745             napi_create_uint32(env, asyncContext->osAccountsCount, &dataJs);
746         }
747     }
748     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
749     delete asyncContext;
750 }
751 
ParseParaDbDeviceId(napi_env env,napi_callback_info cbInfo,DbDeviceIdAsyncContext * asyncContext)752 bool ParseParaDbDeviceId(napi_env env, napi_callback_info cbInfo, DbDeviceIdAsyncContext *asyncContext)
753 {
754     return ParseOneParaContext(env, cbInfo, asyncContext);
755 }
756 
DbDeviceIdExecuteCB(napi_env env,void * data)757 void DbDeviceIdExecuteCB(napi_env env, void *data)
758 {
759     DbDeviceIdAsyncContext *asyncContext = reinterpret_cast<DbDeviceIdAsyncContext *>(data);
760     asyncContext->errCode = OsAccountManager::GetDistributedVirtualDeviceId(asyncContext->deviceId);
761     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
762     if (asyncContext->errCode == ERR_ACCOUNT_COMMON_PERMISSION_DENIED) {
763         uint32_t targetVersion = 0;
764         if (GetSelfTargetVersion(targetVersion) && (targetVersion < COMPATIBILITY_CHANGE_VERSION_API12)) {
765             asyncContext->errCode = ERR_OSACCOUNT_KIT_GET_DISTRIBUTED_VIRTUAL_DEVICE_ID_ERROR;
766         }
767     }
768     if (asyncContext->errCode != ERR_OK) {
769         ACCOUNT_LOGE("GetDistributedVirtualDeviceId err is %{public}d", asyncContext->errCode);
770     }
771 }
772 
DbDeviceIdCallbackCompletedCB(napi_env env,napi_status status,void * data)773 void DbDeviceIdCallbackCompletedCB(napi_env env, napi_status status, void *data)
774 {
775     ACCOUNT_LOGD("napi_create_async_work complete");
776     DbDeviceIdAsyncContext *asyncContext = reinterpret_cast<DbDeviceIdAsyncContext *>(data);
777     napi_value errJs = nullptr;
778     napi_value dataJs = nullptr;
779     if (asyncContext->status == napi_ok) {
780         errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
781         napi_create_string_utf8(env, asyncContext->deviceId.c_str(), NAPI_AUTO_LENGTH, &dataJs);
782     } else {
783         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
784         if (asyncContext->throwErr) {
785             napi_get_null(env, &dataJs);
786         } else {
787             napi_create_string_utf8(env, asyncContext->deviceId.c_str(), NAPI_AUTO_LENGTH, &dataJs);
788         }
789     }
790     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
791     delete asyncContext;
792 }
793 
ParseParaGetAllCons(napi_env env,napi_callback_info cbInfo,GetAllConsAsyncContext * asyncContext)794 bool ParseParaGetAllCons(napi_env env, napi_callback_info cbInfo, GetAllConsAsyncContext *asyncContext)
795 {
796     return ParseCallbackAndId(env, cbInfo, asyncContext->callbackRef, asyncContext->id, asyncContext->throwErr);
797 }
798 
GetAllConsExecuteCB(napi_env env,void * data)799 void GetAllConsExecuteCB(napi_env env, void *data)
800 {
801     GetAllConsAsyncContext *asyncContext = reinterpret_cast<GetAllConsAsyncContext *>(data);
802     asyncContext->errCode = OsAccountManager::GetOsAccountAllConstraints(asyncContext->id, asyncContext->constraints);
803     // for compatibility
804     if ((!asyncContext->throwErr) && (asyncContext->errCode == ERR_ACCOUNT_COMMON_PERMISSION_DENIED)) {
805         asyncContext->errCode = ERR_OSACCOUNT_KIT_GET_OS_ACCOUNT_ALL_CONSTRAINTS_ERROR;
806     }
807     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
808 }
809 
GetAllConsCallbackCompletedCB(napi_env env,napi_status status,void * data)810 void GetAllConsCallbackCompletedCB(napi_env env, napi_status status, void *data)
811 {
812     ACCOUNT_LOGD("napi_create_async_work complete");
813     GetAllConsAsyncContext *asyncContext = reinterpret_cast<GetAllConsAsyncContext *>(data);
814     napi_value errJs = nullptr;
815     napi_value dataJs = nullptr;
816     if (asyncContext->status == napi_ok) {
817         errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
818         GetAllAccountCons(env, asyncContext->constraints, dataJs);
819     } else {
820         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
821         if (asyncContext->throwErr) {
822             napi_get_null(env, &dataJs);
823         } else {
824             GetAllAccountCons(env, asyncContext->constraints, dataJs);
825         }
826     }
827     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
828     delete asyncContext;
829 }
830 
GetAllAccountCons(napi_env env,const std::vector<std::string> & info,napi_value & result)831 void GetAllAccountCons(napi_env env, const std::vector<std::string> &info, napi_value &result)
832 {
833     napi_create_array(env, &result);
834     uint32_t index = 0;
835 
836     for (auto item : info) {
837         napi_value consStr = nullptr;
838         napi_create_string_utf8(env, item.c_str(), NAPI_AUTO_LENGTH, &consStr);
839         napi_set_element(env, result, index, consStr);
840         index++;
841     }
842 }
843 
GetActiveIds(napi_env env,const std::vector<int> & ids,napi_value & result)844 void GetActiveIds(napi_env env, const std::vector<int> &ids, napi_value &result)
845 {
846     napi_create_array(env, &result);
847     uint32_t index = 0;
848 
849     for (auto id : ids) {
850         napi_value tempID = nullptr;
851         napi_create_int32(env, id, &tempID);
852         napi_set_element(env, result, index, tempID);
853         index++;
854     }
855 }
856 
ParseParaProcessId(napi_env env,napi_callback_info cbInfo,GetIdAsyncContext * asyncContext)857 bool ParseParaProcessId(napi_env env, napi_callback_info cbInfo, GetIdAsyncContext *asyncContext)
858 {
859     return ParseOneParaContext(env, cbInfo, asyncContext);
860 }
861 
GetProcessIdExecuteCB(napi_env env,void * data)862 void GetProcessIdExecuteCB(napi_env env, void *data)
863 {
864     GetIdAsyncContext *asyncContext = reinterpret_cast<GetIdAsyncContext *>(data);
865     asyncContext->errCode = OsAccountManager::GetOsAccountLocalIdFromProcess(asyncContext->id);
866     ACCOUNT_LOGD("error code is %{public}d", asyncContext->errCode);
867     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
868 }
869 
GetProcessIdCallbackCompletedCB(napi_env env,napi_status status,void * data)870 void GetProcessIdCallbackCompletedCB(napi_env env, napi_status status, void *data)
871 {
872     ACCOUNT_LOGD("napi_create_async_work complete");
873     GetIdAsyncContext *asyncContext = reinterpret_cast<GetIdAsyncContext *>(data);
874     napi_value errJs = nullptr;
875     napi_value dataJs = nullptr;
876     if (asyncContext->status == napi_ok) {
877         errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
878         napi_create_int32(env, asyncContext->id, &dataJs);
879     } else {
880         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
881         if (asyncContext->throwErr) {
882             napi_get_null(env, &dataJs);
883         } else {
884             napi_create_int32(env, asyncContext->id, &dataJs);
885         }
886     }
887     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
888     delete asyncContext;
889 }
890 
ParseQueryAllCreateOA(napi_env env,napi_callback_info cbInfo,QueryCreateOAAsyncContext * asyncContext)891 bool ParseQueryAllCreateOA(napi_env env, napi_callback_info cbInfo, QueryCreateOAAsyncContext *asyncContext)
892 {
893     return ParseOneParaContext(env, cbInfo, asyncContext);
894 }
895 
ParseQueryOAConstraintSrcTypes(napi_env env,napi_callback_info cbInfo,QueryOAConstraintSrcTypeContext * asyncContext)896 bool ParseQueryOAConstraintSrcTypes(napi_env env, napi_callback_info cbInfo,
897     QueryOAConstraintSrcTypeContext *asyncContext)
898 {
899     size_t argc = ARGS_SIZE_THREE;
900     napi_value argv[ARGS_SIZE_THREE] = {0};
901     napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
902     if (argc == ARGS_SIZE_THREE) {
903         if (!GetCallbackProperty(env, argv[argc - 1], asyncContext->callbackRef, 1)) {
904             ACCOUNT_LOGE("Get callbackRef failed");
905             std::string errMsg = "Parameter error. The type of \"callback\" must be function";
906             AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
907             return false;
908         }
909     }
910 
911     if (!GetIntProperty(env, argv[PARAMZERO], asyncContext->id)) {
912         ACCOUNT_LOGE("Get id failed");
913         std::string errMsg = "Parameter error. The type of \"localId\" must be number";
914         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
915         return false;
916     }
917     if (!GetStringProperty(env, argv[PARAMONE], asyncContext->constraint)) {
918         ACCOUNT_LOGE("Get constraint failed");
919         std::string errMsg = "Parameter error. The type of \"constraint\" must be string";
920         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
921         return false;
922     }
923 
924     return true;
925 }
926 
QueryOAContSrcTypeExecuteCB(napi_env env,void * data)927 void QueryOAContSrcTypeExecuteCB(napi_env env, void *data)
928 {
929     QueryOAConstraintSrcTypeContext *asyncContext = reinterpret_cast<QueryOAConstraintSrcTypeContext *>(data);
930     asyncContext->errCode = OsAccountManager::QueryOsAccountConstraintSourceTypes(asyncContext->id,
931         asyncContext->constraint, asyncContext->constraintSourceTypeInfos);
932     ACCOUNT_LOGI("errocde is %{public}d", asyncContext->errCode);
933     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
934 }
935 
QueryOAContSrcTypeCallbackCompletedCB(napi_env env,napi_status status,void * data)936 void QueryOAContSrcTypeCallbackCompletedCB(napi_env env, napi_status status, void *data)
937 {
938     ACCOUNT_LOGI("napi_create_async_work complete");
939     QueryOAConstraintSrcTypeContext *asyncContext = reinterpret_cast<QueryOAConstraintSrcTypeContext *>(data);
940     napi_value errJs = nullptr;
941     napi_value dataJs = nullptr;
942     if (asyncContext->status == napi_ok) {
943         napi_get_null(env, &errJs);
944         QueryOAContSrcTypeForResult(env, asyncContext->constraintSourceTypeInfos, dataJs);
945     } else {
946         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
947         napi_get_null(env, &dataJs);
948     }
949     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
950     delete asyncContext;
951 }
952 
QueryOAContSrcTypeForResult(napi_env env,const std::vector<ConstraintSourceTypeInfo> & infos,napi_value & result)953 void QueryOAContSrcTypeForResult(napi_env env, const std::vector<ConstraintSourceTypeInfo> &infos, napi_value &result)
954 {
955     napi_create_array(env, &result);
956     uint32_t index = 0;
957 
958     for (auto item : infos) {
959         napi_value objTypeInfo = nullptr;
960         napi_create_object(env, &objTypeInfo);
961 
962         napi_value srcLocalId = nullptr;
963         napi_create_int32(env, item.localId, &srcLocalId);
964         napi_set_named_property(env, objTypeInfo, "localId", srcLocalId);
965 
966         napi_value valToJs = nullptr;
967         napi_create_int32(env, item.typeInfo, &valToJs);
968 
969         napi_set_named_property(env, objTypeInfo, "type", valToJs);
970         napi_set_element(env, result, index, objTypeInfo);
971         index++;
972     }
973 }
974 
ParseQueryActiveIds(napi_env env,napi_callback_info cbInfo,QueryActiveIdsAsyncContext * asyncContext)975 bool ParseQueryActiveIds(napi_env env, napi_callback_info cbInfo, QueryActiveIdsAsyncContext *asyncContext)
976 {
977     return ParseOneParaContext(env, cbInfo, asyncContext);
978 }
979 
QueryCreateOAExecuteCB(napi_env env,void * data)980 void QueryCreateOAExecuteCB(napi_env env, void *data)
981 {
982     QueryCreateOAAsyncContext *asyncContext = reinterpret_cast<QueryCreateOAAsyncContext *>(data);
983     asyncContext->errCode = OsAccountManager::QueryAllCreatedOsAccounts(asyncContext->osAccountInfos);
984     ACCOUNT_LOGD("error code is %{public}d", asyncContext->errCode);
985     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
986 }
987 
QueryActiveIdsExecuteCB(napi_env env,void * data)988 void QueryActiveIdsExecuteCB(napi_env env, void *data)
989 {
990     QueryActiveIdsAsyncContext *asyncContext = reinterpret_cast<QueryActiveIdsAsyncContext *>(data);
991     asyncContext->errCode = OsAccountManager::QueryActiveOsAccountIds(asyncContext->osAccountIds);
992     ACCOUNT_LOGD("error code is %{public}d", asyncContext->errCode);
993     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
994 }
995 
QueryCreateOACallbackCompletedCB(napi_env env,napi_status status,void * data)996 void QueryCreateOACallbackCompletedCB(napi_env env, napi_status status, void *data)
997 {
998     ACCOUNT_LOGD("napi_create_async_work complete");
999     QueryCreateOAAsyncContext *asyncContext = reinterpret_cast<QueryCreateOAAsyncContext *>(data);
1000     napi_value errJs = nullptr;
1001     napi_value dataJs = nullptr;
1002     if (asyncContext->status == napi_ok) {
1003         napi_get_null(env, &errJs);
1004         QueryOAInfoForResult(env, asyncContext->osAccountInfos, dataJs);
1005     } else {
1006         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1007         napi_get_null(env, &dataJs);
1008     }
1009     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1010     delete asyncContext;
1011 }
1012 
GetForegroundOALocalIdExecuteCB(napi_env env,void * data)1013 void GetForegroundOALocalIdExecuteCB(napi_env env, void *data)
1014 {
1015     GetForegroundOALocalIdAsyncContext *asyncContext = reinterpret_cast<GetForegroundOALocalIdAsyncContext *>(data);
1016     asyncContext->errCode = OsAccountManager::GetForegroundOsAccountLocalId(asyncContext->id);
1017 }
1018 
GetForegroundOALocalIdCallbackCompletedCB(napi_env env,napi_status status,void * data)1019 void GetForegroundOALocalIdCallbackCompletedCB(napi_env env, napi_status status, void *data)
1020 {
1021     GetForegroundOALocalIdAsyncContext *asyncContext = reinterpret_cast<GetForegroundOALocalIdAsyncContext *>(data);
1022     std::unique_ptr<GetForegroundOALocalIdAsyncContext> asyncContextPtr{asyncContext};
1023     napi_value errJs = nullptr;
1024     napi_value dataJs = nullptr;
1025     if (asyncContext->errCode == ERR_OK) {
1026         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &errJs));
1027         NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, asyncContext->id, &dataJs));
1028     } else {
1029         errJs = GenerateBusinessError(env, asyncContext->errCode);
1030         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &dataJs));
1031     }
1032     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1033 }
1034 
QueryActiveIdsCallbackCompletedCB(napi_env env,napi_status status,void * data)1035 void QueryActiveIdsCallbackCompletedCB(napi_env env, napi_status status, void *data)
1036 {
1037     ACCOUNT_LOGD("napi_create_async_work complete");
1038     QueryActiveIdsAsyncContext *asyncContext = reinterpret_cast<QueryActiveIdsAsyncContext *>(data);
1039     napi_value errJs = nullptr;
1040     napi_value dataJs = nullptr;
1041     if (asyncContext->status == napi_ok) {
1042         errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
1043         GetActiveIds(env, asyncContext->osAccountIds, dataJs);
1044     } else {
1045         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1046         if (asyncContext->throwErr) {
1047             napi_get_null(env, &dataJs);
1048         } else {
1049             GetActiveIds(env, asyncContext->osAccountIds, dataJs);
1050         }
1051     }
1052     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1053     delete asyncContext;
1054 }
1055 
QueryOAInfoForResult(napi_env env,const std::vector<OsAccountInfo> & info,napi_value & result)1056 void QueryOAInfoForResult(napi_env env, const std::vector<OsAccountInfo> &info, napi_value &result)
1057 {
1058     napi_create_array(env, &result);
1059     uint32_t index = 0;
1060 
1061     for (auto item : info) {
1062         napi_value objOAInfo = nullptr;
1063         napi_create_object(env, &objOAInfo);
1064         GetOACBInfoToJs(env, item, objOAInfo);
1065         napi_set_element(env, result, index, objOAInfo);
1066         index++;
1067     }
1068 }
1069 
ParseParaGetPhoto(napi_env env,napi_callback_info cbInfo,GetOAPhotoAsyncContext * asyncContext)1070 bool ParseParaGetPhoto(napi_env env, napi_callback_info cbInfo, GetOAPhotoAsyncContext *asyncContext)
1071 {
1072     return ParseCallbackAndId(env, cbInfo, asyncContext->callbackRef, asyncContext->id, asyncContext->throwErr);
1073 }
1074 
GetOsAccountNameExecuteCB(napi_env env,void * data)1075 void GetOsAccountNameExecuteCB(napi_env env, void *data)
1076 {
1077     ACCOUNT_LOGD("Running napi_create_async_work");
1078     GetOsAccountNameContext *asyncContext = reinterpret_cast<GetOsAccountNameContext *>(data);
1079     asyncContext->errCode = OsAccountManager::GetOsAccountName(asyncContext->name);
1080 }
1081 
GetOsAccountNameCallbackCompletedCB(napi_env env,napi_status status,void * data)1082 void GetOsAccountNameCallbackCompletedCB(napi_env env, napi_status status, void *data)
1083 {
1084     ACCOUNT_LOGD("Complete napi_create_async_work");
1085     GetOsAccountNameContext *asyncContext = reinterpret_cast<GetOsAccountNameContext *>(data);
1086     napi_value errJs = nullptr;
1087     napi_value dataJs = nullptr;
1088     if (asyncContext->errCode == napi_ok) {
1089         napi_get_null(env, &errJs);
1090         napi_create_string_utf8(env, asyncContext->name.c_str(), NAPI_AUTO_LENGTH, &dataJs);
1091     } else {
1092         errJs = GenerateBusinessError(env, asyncContext->errCode);
1093         napi_get_null(env, &dataJs);
1094     }
1095     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1096     delete asyncContext;
1097 }
1098 
GetOAPhotoExecuteCB(napi_env env,void * data)1099 void GetOAPhotoExecuteCB(napi_env env, void *data)
1100 {
1101     ACCOUNT_LOGD("napi_create_async_work running");
1102     GetOAPhotoAsyncContext *asyncContext = reinterpret_cast<GetOAPhotoAsyncContext *>(data);
1103     asyncContext->errCode = OsAccountManager::GetOsAccountProfilePhoto(asyncContext->id, asyncContext->photo);
1104     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1105 }
1106 
GetOAPhotoCallbackCompletedCB(napi_env env,napi_status status,void * data)1107 void GetOAPhotoCallbackCompletedCB(napi_env env, napi_status status, void *data)
1108 {
1109     ACCOUNT_LOGD("napi_create_async_work complete");
1110     GetOAPhotoAsyncContext *asyncContext = reinterpret_cast<GetOAPhotoAsyncContext *>(data);
1111     napi_value errJs = nullptr;
1112     napi_value dataJs = nullptr;
1113     if (asyncContext->status == napi_ok) {
1114         napi_get_null(env, &errJs);
1115         napi_create_string_utf8(env, asyncContext->photo.c_str(), NAPI_AUTO_LENGTH, &dataJs);
1116     } else {
1117         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1118         napi_get_null(env, &dataJs);
1119     }
1120     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1121     delete asyncContext;
1122 }
1123 
ParseParaCurrentOA(napi_env env,napi_callback_info cbInfo,CurrentOAAsyncContext * asyncContext)1124 bool ParseParaCurrentOA(napi_env env, napi_callback_info cbInfo, CurrentOAAsyncContext *asyncContext)
1125 {
1126     return ParseOneParaContext(env, cbInfo, asyncContext);
1127 }
1128 
QueryCurrentOAExecuteCB(napi_env env,void * data)1129 void QueryCurrentOAExecuteCB(napi_env env, void *data)
1130 {
1131     CurrentOAAsyncContext *asyncContext = reinterpret_cast<CurrentOAAsyncContext *>(data);
1132     asyncContext->errCode = OsAccountManager::QueryCurrentOsAccount(asyncContext->osAccountInfos);
1133     // for compatibility
1134     if ((!asyncContext->throwErr) && (asyncContext->errCode == ERR_ACCOUNT_COMMON_PERMISSION_DENIED)) {
1135         asyncContext->errCode = ERR_OSACCOUNT_KIT_QUERY_CURRENT_OS_ACCOUNT_ERROR;
1136     }
1137     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1138 }
1139 
QueryCurrentOACallbackCompletedCB(napi_env env,napi_status status,void * data)1140 void QueryCurrentOACallbackCompletedCB(napi_env env, napi_status status, void *data)
1141 {
1142     CurrentOAAsyncContext *asyncContext = reinterpret_cast<CurrentOAAsyncContext *>(data);
1143     napi_value errJs = nullptr;
1144     napi_value dataJs = nullptr;
1145     if (asyncContext->status == napi_ok) {
1146         errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
1147         GetOACBInfoToJs(env, asyncContext->osAccountInfos, dataJs);
1148     } else {
1149         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1150         if (asyncContext->throwErr) {
1151             napi_get_null(env, &dataJs);
1152         } else {
1153             GetOACBInfoToJs(env, asyncContext->osAccountInfos, dataJs);
1154         }
1155     }
1156     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1157     delete asyncContext;
1158 }
1159 
ParseParaGetIdByUid(napi_env env,napi_callback_info cbInfo,GetIdByUidAsyncContext * asyncContext)1160 bool ParseParaGetIdByUid(napi_env env, napi_callback_info cbInfo, GetIdByUidAsyncContext *asyncContext)
1161 {
1162     size_t argc = ARGS_SIZE_TWO;
1163     napi_value argv[ARGS_SIZE_TWO] = {0};
1164     napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
1165     if (argc == ARGS_SIZE_TWO) {
1166         if (!GetCallbackProperty(env, argv[argc - 1], asyncContext->callbackRef, 1)) {
1167             ACCOUNT_LOGE("Get callbackRef failed");
1168             std::string errMsg = "Parameter error. The type of \"callback\" must be function";
1169             AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1170             return false;
1171         }
1172     }
1173 
1174     if (!GetIntProperty(env, argv[PARAMZERO], asyncContext->uid)) {
1175         ACCOUNT_LOGE("Get uid failed");
1176         std::string errMsg = "Parameter error. The type of \"uid\" must be number";
1177         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1178         return false;
1179     }
1180     return true;
1181 }
1182 
ParseParaGetIdByDomain(napi_env env,napi_callback_info cbInfo,GetIdByDomainAsyncContext * asyncContext)1183 bool ParseParaGetIdByDomain(napi_env env, napi_callback_info cbInfo, GetIdByDomainAsyncContext *asyncContext)
1184 {
1185     size_t argc = ARGS_SIZE_TWO;
1186     napi_value argv[ARGS_SIZE_TWO] = {0};
1187     napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
1188     if (argc == ARGS_SIZE_TWO) {
1189         if (!GetCallbackProperty(env, argv[argc - 1], asyncContext->callbackRef, 1)) {
1190             ACCOUNT_LOGE("Get callbackRef failed");
1191             std::string errMsg = "The type of arg " + std::to_string(argc) + " must be function";
1192             AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1193             return false;
1194         }
1195     }
1196 
1197     if (!ParseDomainAccountInfo(env, argv[PARAMZERO], asyncContext->domainInfo)) {
1198         ACCOUNT_LOGE("get domainInfo failed");
1199         std::string errMsg = "DomainInfo parse failed";
1200         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1201         return false;
1202     }
1203     return true;
1204 }
1205 
GetIdByUidExecuteCB(napi_env env,void * data)1206 void GetIdByUidExecuteCB(napi_env env, void *data)
1207 {
1208     GetIdByUidAsyncContext *asyncContext = reinterpret_cast<GetIdByUidAsyncContext *>(data);
1209     NativeErrMsg() = "";
1210     asyncContext->errCode = OsAccountManager::GetOsAccountLocalIdFromUid(asyncContext->uid, asyncContext->id);
1211     asyncContext->nativeErrMsg = NativeErrMsg();
1212     ACCOUNT_LOGD("error code is %{public}d", asyncContext->errCode);
1213     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1214 }
1215 
GetBundleIdByUidExecuteCB(napi_env env,void * data)1216 void GetBundleIdByUidExecuteCB(napi_env env, void *data)
1217 {
1218     GetIdByUidAsyncContext *asyncContext = reinterpret_cast<GetIdByUidAsyncContext *>(data);
1219     asyncContext->errCode = OsAccountManager::GetBundleIdFromUid(asyncContext->uid, asyncContext->id);
1220     ACCOUNT_LOGD("error code is %{public}d", asyncContext->errCode);
1221     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1222 }
1223 
GetIdByDomainExecuteCB(napi_env env,void * data)1224 void GetIdByDomainExecuteCB(napi_env env, void *data)
1225 {
1226     GetIdByDomainAsyncContext *asyncContext = reinterpret_cast<GetIdByDomainAsyncContext *>(data);
1227     NativeErrMsg() = "";
1228     asyncContext->errCode = OsAccountManager::GetOsAccountLocalIdFromDomain(
1229         asyncContext->domainInfo, asyncContext->id);
1230     ACCOUNT_LOGD("error code is %{public}d", asyncContext->errCode);
1231     asyncContext->nativeErrMsg = NativeErrMsg();
1232     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1233 }
1234 
GetIdByUidCallbackCompletedCB(napi_env env,napi_status status,void * data)1235 void GetIdByUidCallbackCompletedCB(napi_env env, napi_status status, void *data)
1236 {
1237     ACCOUNT_LOGD("napi_create_async_work complete");
1238     GetIdByUidAsyncContext *asyncContext = reinterpret_cast<GetIdByUidAsyncContext *>(data);
1239     napi_value errJs = nullptr;
1240     napi_value dataJs = nullptr;
1241     if (asyncContext->status == napi_ok) {
1242         errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
1243         napi_create_int32(env, asyncContext->id, &dataJs);
1244     } else {
1245         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1246         if (asyncContext->throwErr) {
1247             napi_get_null(env, &dataJs);
1248         } else {
1249             napi_create_int32(env, asyncContext->id, &dataJs);
1250         }
1251     }
1252     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1253     delete asyncContext;
1254 }
1255 
GetBundleIdByUidCallbackCompletedCB(napi_env env,napi_status status,void * data)1256 void GetBundleIdByUidCallbackCompletedCB(napi_env env, napi_status status, void *data)
1257 {
1258     ACCOUNT_LOGD("napi_create_async_work complete");
1259     GetIdByUidAsyncContext *asyncContext = reinterpret_cast<GetIdByUidAsyncContext *>(data);
1260     napi_value errJs = nullptr;
1261     napi_value dataJs = nullptr;
1262     if (asyncContext->status == napi_ok) {
1263         napi_get_null(env, &errJs);
1264         napi_create_int32(env, asyncContext->id, &dataJs);
1265     } else {
1266         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1267         napi_get_null(env, &dataJs);
1268     }
1269     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1270     delete asyncContext;
1271 }
1272 
GetIdByDomainCallbackCompletedCB(napi_env env,napi_status status,void * data)1273 void GetIdByDomainCallbackCompletedCB(napi_env env, napi_status status, void *data)
1274 {
1275     ACCOUNT_LOGD("napi_create_async_work complete");
1276     GetIdByDomainAsyncContext *asyncContext = reinterpret_cast<GetIdByDomainAsyncContext *>(data);
1277     napi_value errJs = nullptr;
1278     napi_value dataJs = nullptr;
1279     if (asyncContext->status == napi_ok) {
1280         errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
1281         napi_create_int32(env, asyncContext->id, &dataJs);
1282     } else {
1283         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1284         if (asyncContext->throwErr) {
1285             napi_get_null(env, &dataJs);
1286         } else {
1287             napi_create_int32(env, asyncContext->id, &dataJs);
1288         }
1289     }
1290     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1291     delete asyncContext;
1292 }
1293 
ParseParaSetPhoto(napi_env env,napi_callback_info cbInfo,SetOAPhotoAsyncContext * asyncContext)1294 bool ParseParaSetPhoto(napi_env env, napi_callback_info cbInfo, SetOAPhotoAsyncContext *asyncContext)
1295 {
1296     size_t argc = ARGS_SIZE_THREE;
1297     napi_value argv[ARGS_SIZE_THREE] = {0};
1298     napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
1299     if (argc == ARGS_SIZE_THREE) {
1300         if (!GetCallbackProperty(env, argv[argc - 1], asyncContext->callbackRef, 1)) {
1301             ACCOUNT_LOGE("Get callbackRef failed");
1302             std::string errMsg = "Parameter error. The type of \"callback\" must be function";
1303             AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1304             return false;
1305         }
1306     }
1307 
1308     if (!GetIntProperty(env, argv[PARAMZERO], asyncContext->id)) {
1309         ACCOUNT_LOGE("Get id failed");
1310         std::string errMsg = "Parameter error. The type of \"localId\" must be number";
1311         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1312         return false;
1313     }
1314     if (!GetStringProperty(env, argv[PARAMONE], asyncContext->photo)) {
1315         ACCOUNT_LOGE("Get photo failed");
1316         std::string errMsg = "Parameter error. The type of \"photo\" must be string";
1317         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1318         return false;
1319     }
1320 
1321     return true;
1322 }
1323 
SetPhotoExecuteCB(napi_env env,void * data)1324 void SetPhotoExecuteCB(napi_env env, void *data)
1325 {
1326     SetOAPhotoAsyncContext *asyncContext = reinterpret_cast<SetOAPhotoAsyncContext *>(data);
1327     asyncContext->errCode = OsAccountManager::SetOsAccountProfilePhoto(asyncContext->id, asyncContext->photo);
1328     ACCOUNT_LOGD("error code is %{public}d", asyncContext->errCode);
1329     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1330 }
1331 
SetPhotoCompletedCB(napi_env env,napi_status status,void * data)1332 void SetPhotoCompletedCB(napi_env env, napi_status status, void *data)
1333 {
1334     ACCOUNT_LOGD("napi_create_async_work complete");
1335     SetOAPhotoAsyncContext *asyncContext = reinterpret_cast<SetOAPhotoAsyncContext *>(data);
1336     napi_value errJs = nullptr;
1337     napi_value dataJs = nullptr;
1338     if (asyncContext->status == napi_ok) {
1339         napi_get_null(env, &errJs);
1340         napi_get_null(env, &dataJs);
1341     } else {
1342         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1343         napi_get_null(env, &dataJs);
1344     }
1345     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1346     delete asyncContext;
1347 }
1348 
ParseParaQueryMaxNum(napi_env env,napi_callback_info cbInfo,QueryMaxNumAsyncContext * asyncContext)1349 bool ParseParaQueryMaxNum(napi_env env, napi_callback_info cbInfo, QueryMaxNumAsyncContext *asyncContext)
1350 {
1351     return ParseOneParaContext(env, cbInfo, asyncContext);
1352 }
1353 
QueryMaxNumExecuteCB(napi_env env,void * data)1354 void QueryMaxNumExecuteCB(napi_env env, void *data)
1355 {
1356     QueryMaxNumAsyncContext *asyncContext = reinterpret_cast<QueryMaxNumAsyncContext *>(data);
1357     asyncContext->errCode = OsAccountManager::QueryMaxOsAccountNumber(asyncContext->maxOsAccountNumber);
1358     ACCOUNT_LOGD("error code is %{public}d", asyncContext->errCode);
1359     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1360 }
1361 
QueryMaxNumCompletedCB(napi_env env,napi_status status,void * data)1362 void QueryMaxNumCompletedCB(napi_env env, napi_status status, void *data)
1363 {
1364     ACCOUNT_LOGD("napi_create_async_work complete");
1365     QueryMaxNumAsyncContext *asyncContext = reinterpret_cast<QueryMaxNumAsyncContext *>(data);
1366     napi_value errJs = nullptr;
1367     napi_value dataJs = nullptr;
1368     if (asyncContext->status == napi_ok) {
1369         napi_get_null(env, &errJs);
1370         napi_create_uint32(env, asyncContext->maxOsAccountNumber, &dataJs);
1371     } else {
1372         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1373         napi_get_null(env, &dataJs);
1374     }
1375     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1376     delete asyncContext;
1377 }
1378 
ParseParaIsActived(napi_env env,napi_callback_info cbInfo,IsActivedAsyncContext * asyncContext)1379 bool ParseParaIsActived(napi_env env, napi_callback_info cbInfo, IsActivedAsyncContext *asyncContext)
1380 {
1381     return ParseCallbackAndId(env, cbInfo, asyncContext->callbackRef, asyncContext->id, asyncContext->throwErr);
1382 }
1383 
IsActivedExecuteCB(napi_env env,void * data)1384 void IsActivedExecuteCB(napi_env env, void *data)
1385 {
1386     IsActivedAsyncContext *asyncContext = reinterpret_cast<IsActivedAsyncContext *>(data);
1387     asyncContext->errCode = OsAccountManager::IsOsAccountActived(asyncContext->id, asyncContext->isOsAccountActived);
1388     // for compatibility
1389     if ((!asyncContext->throwErr) && (asyncContext->errCode == ERR_ACCOUNT_COMMON_PERMISSION_DENIED)) {
1390         asyncContext->errCode = ERR_OSACCOUNT_KIT_IS_OS_ACCOUNT_ACTIVED_ERROR;
1391     }
1392     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1393 }
1394 
IsActivedCompletedCB(napi_env env,napi_status status,void * data)1395 void IsActivedCompletedCB(napi_env env, napi_status status, void *data)
1396 {
1397     ACCOUNT_LOGD("napi_create_async_work complete");
1398     IsActivedAsyncContext *asyncContext = reinterpret_cast<IsActivedAsyncContext *>(data);
1399     napi_value errJs = nullptr;
1400     napi_value dataJs = nullptr;
1401     if (asyncContext->status == napi_ok) {
1402         errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
1403         napi_get_boolean(env, asyncContext->isOsAccountActived, &dataJs);
1404     } else {
1405         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1406         if (asyncContext->throwErr) {
1407             napi_get_null(env, &dataJs);
1408         } else {
1409             napi_get_boolean(env, asyncContext->isOsAccountActived, &dataJs);
1410         }
1411     }
1412     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1413     delete asyncContext;
1414 }
1415 
ParseParaIsEnable(napi_env env,napi_callback_info cbInfo,IsConEnableAsyncContext * asyncContext)1416 bool ParseParaIsEnable(napi_env env, napi_callback_info cbInfo, IsConEnableAsyncContext *asyncContext)
1417 {
1418     size_t argc = ARGS_SIZE_THREE;
1419     napi_value argv[ARGS_SIZE_THREE] = {0};
1420     napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
1421     if (argc == ARGS_SIZE_ONE) {
1422         std::vector<int> ids;
1423         ErrCode errCode = OsAccountManager::QueryActiveOsAccountIds(ids);
1424         if (errCode != ERR_OK) {
1425             ACCOUNT_LOGE("Get id failed");
1426             AccountNapiThrow(env, errCode, asyncContext->throwErr);
1427             return false;
1428         }
1429         if (ids.empty()) {
1430             ACCOUNT_LOGE("No Active OsAccount Ids");
1431             std::string errMsg = "No active osAccount ids, please wait for the user's startup to complete.";
1432             AccountNapiThrow(env, ERR_JS_INVALID_PARAMETER, errMsg, asyncContext->throwErr);
1433             return false;
1434         }
1435         asyncContext->id = ids[0];
1436         if (!GetStringProperty(env, argv[PARAMZERO], asyncContext->constraint)) {
1437             ACCOUNT_LOGE("Get constraint failed");
1438             std::string errMsg = "Parameter error. The type of \"constraint\" must be string";
1439             AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1440             return false;
1441         }
1442         return true;
1443     }
1444     if (argc == ARGS_SIZE_THREE) {
1445         if (!GetCallbackProperty(env, argv[argc - 1], asyncContext->callbackRef, 1)) {
1446             ACCOUNT_LOGE("Get callbackRef failed");
1447             std::string errMsg = "Parameter error. The type of \"callback\" must be function";
1448             AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1449             return false;
1450         }
1451     }
1452 
1453     if (!GetIntProperty(env, argv[PARAMZERO], asyncContext->id)) {
1454         ACCOUNT_LOGE("Get id failed");
1455         std::string errMsg = "Parameter error. The type of \"localId\" must be number";
1456         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1457         return false;
1458     }
1459     if (!GetStringProperty(env, argv[PARAMONE], asyncContext->constraint)) {
1460         ACCOUNT_LOGE("Get constraint failed");
1461         std::string errMsg = "Parameter error. The type of \"constraint\" must be string";
1462         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1463         return false;
1464     }
1465     return true;
1466 }
1467 
IsEnableExecuteCB(napi_env env,void * data)1468 void IsEnableExecuteCB(napi_env env, void *data)
1469 {
1470     IsConEnableAsyncContext *asyncContext = reinterpret_cast<IsConEnableAsyncContext *>(data);
1471     if (asyncContext->throwErr) {
1472         asyncContext->errCode = OsAccountManager::CheckOsAccountConstraintEnabled(asyncContext->id,
1473             asyncContext->constraint, asyncContext->isConsEnable);
1474     } else {
1475         asyncContext->errCode = OsAccountManager::IsOsAccountConstraintEnable(asyncContext->id,
1476             asyncContext->constraint, asyncContext->isConsEnable);
1477     }
1478 
1479     // for compatibility
1480     if ((!asyncContext->throwErr) && (asyncContext->errCode == ERR_ACCOUNT_COMMON_PERMISSION_DENIED)) {
1481         asyncContext->errCode = ERR_OSACCOUNT_KIT_IS_OS_ACCOUNT_CONSTRAINT_ENABLE_ERROR;
1482     }
1483     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1484 }
1485 
IsEnableCompletedCB(napi_env env,napi_status status,void * data)1486 void IsEnableCompletedCB(napi_env env, napi_status status, void *data)
1487 {
1488     ACCOUNT_LOGD("napi_create_async_work complete");
1489     IsConEnableAsyncContext *asyncContext = reinterpret_cast<IsConEnableAsyncContext *>(data);
1490     napi_value errJs = nullptr;
1491     napi_value dataJs = nullptr;
1492     if (asyncContext->status == napi_ok) {
1493         errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
1494         napi_get_boolean(env, asyncContext->isConsEnable, &dataJs);
1495     } else {
1496         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1497         if (asyncContext->throwErr) {
1498             napi_get_null(env, &dataJs);
1499         } else {
1500             napi_get_boolean(env, asyncContext->isConsEnable, &dataJs);
1501         }
1502     }
1503     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1504     delete asyncContext;
1505 }
1506 
ParseParaGetType(napi_env env,napi_callback_info cbInfo,GetTypeAsyncContext * asyncContext)1507 bool ParseParaGetType(napi_env env, napi_callback_info cbInfo, GetTypeAsyncContext *asyncContext)
1508 {
1509     size_t argc = ARGS_SIZE_ONE;
1510     napi_value argv[ARGS_SIZE_ONE] = {0};
1511     napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
1512     if (argc == ARGS_SIZE_ZERO) {
1513         return true;
1514     }
1515 
1516     napi_valuetype valueType = napi_undefined;
1517     napi_typeof(env, argv[PARAMZERO], &valueType);
1518     if (valueType == napi_number) {
1519         napi_get_value_int32(env, argv[PARAMZERO], &(asyncContext->id));
1520         asyncContext->withId = true;
1521     } else if (valueType == napi_function) {
1522         napi_create_reference(env, argv[PARAMZERO], 1, &(asyncContext->callbackRef));
1523     } else {
1524         ACCOUNT_LOGE("Get callbackRef or id failed.");
1525         std::string errMsg = "Parameter error. The type of arg " + std::to_string(argc) + " must be function or number";
1526         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1527         return false;
1528     }
1529     return true;
1530 }
1531 
GetTypeExecuteCB(napi_env env,void * data)1532 void GetTypeExecuteCB(napi_env env, void *data)
1533 {
1534     GetTypeAsyncContext *asyncContext = reinterpret_cast<GetTypeAsyncContext *>(data);
1535     if (asyncContext->withId) {
1536         asyncContext->errCode = OsAccountManager::GetOsAccountType(asyncContext->id, asyncContext->type);
1537     } else {
1538         asyncContext->errCode = OsAccountManager::GetOsAccountTypeFromProcess(asyncContext->type);
1539     }
1540     ACCOUNT_LOGD("error code is %{public}d", asyncContext->errCode);
1541     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1542 }
1543 
GetTypeCompletedCB(napi_env env,napi_status status,void * data)1544 void GetTypeCompletedCB(napi_env env, napi_status status, void *data)
1545 {
1546     GetTypeAsyncContext *asyncContext = reinterpret_cast<GetTypeAsyncContext *>(data);
1547     napi_value errJs = nullptr;
1548     napi_value dataJs = nullptr;
1549     if (asyncContext->status == napi_ok) {
1550         errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
1551         int cType = static_cast<int>(asyncContext->type);
1552         napi_create_int32(env, cType, &dataJs);
1553     } else {
1554         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1555         napi_get_null(env, &dataJs);
1556     }
1557     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1558     delete asyncContext;
1559 }
1560 
ParseParaIsMultiEn(napi_env env,napi_callback_info cbInfo,IsMultiEnAsyncContext * asyncContext)1561 bool ParseParaIsMultiEn(napi_env env, napi_callback_info cbInfo, IsMultiEnAsyncContext *asyncContext)
1562 {
1563     return ParseOneParaContext(env, cbInfo, asyncContext);
1564 }
1565 
IsMultiEnExecuteCB(napi_env env,void * data)1566 void IsMultiEnExecuteCB(napi_env env, void *data)
1567 {
1568     IsMultiEnAsyncContext *asyncContext = reinterpret_cast<IsMultiEnAsyncContext *>(data);
1569     asyncContext->errCode = OsAccountManager::IsMultiOsAccountEnable(asyncContext->isMultiOAEnable);
1570     ACCOUNT_LOGD("error code is %{public}d", asyncContext->errCode);
1571     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1572 }
1573 
IsMultiEnCompletedCB(napi_env env,napi_status status,void * data)1574 void IsMultiEnCompletedCB(napi_env env, napi_status status, void *data)
1575 {
1576     ACCOUNT_LOGD("napi_create_async_work complete");
1577     IsMultiEnAsyncContext *asyncContext = reinterpret_cast<IsMultiEnAsyncContext *>(data);
1578     napi_value errJs = nullptr;
1579     napi_value dataJs = nullptr;
1580     if (asyncContext->status == napi_ok) {
1581         errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
1582         napi_get_boolean(env, asyncContext->isMultiOAEnable, &dataJs);
1583     } else {
1584         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1585         if (asyncContext->throwErr) {
1586             napi_get_null(env, &dataJs);
1587         } else {
1588             napi_get_boolean(env, asyncContext->isMultiOAEnable, &dataJs);
1589         }
1590     }
1591     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1592     delete asyncContext;
1593 }
1594 
ParseParaIsVerifiedWithOneParam(napi_env env,napi_value value,IsVerifiedAsyncContext * asyncContext)1595 static bool ParseParaIsVerifiedWithOneParam(
1596     napi_env env, napi_value value, IsVerifiedAsyncContext *asyncContext)
1597 {
1598     napi_valuetype valueType = napi_undefined;
1599     napi_typeof(env, value, &valueType);
1600     if (valueType == napi_number) {
1601         if (!GetIntProperty(env, value, asyncContext->id)) {
1602             ACCOUNT_LOGE("Get id failed");
1603             std::string errMsg = "Parameter error. The type of \"localId\" must be number";
1604             AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1605             return false;
1606         }
1607         asyncContext->hasAccountId = true;
1608     } else if (valueType == napi_function) {
1609         if (!GetCallbackProperty(env, value, asyncContext->callbackRef, 1)) {
1610             ACCOUNT_LOGE("Get callbackRef failed");
1611             std::string errMsg = "The type of arg 1 must be function";
1612             AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1613             return false;
1614         }
1615     } else if ((valueType == napi_undefined) || (valueType == napi_null)) {
1616         ACCOUNT_LOGI("id is undefined or null");
1617     } else {
1618         ACCOUNT_LOGE("Wrong arg type, expected number or function");
1619         std::string errMsg = "The type of arg 1 must be number or function";
1620         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1621         return false;
1622     }
1623     return true;
1624 }
1625 
ParseParaIsVerified(napi_env env,napi_callback_info cbInfo,IsVerifiedAsyncContext * asyncContext)1626 bool ParseParaIsVerified(napi_env env, napi_callback_info cbInfo, IsVerifiedAsyncContext *asyncContext)
1627 {
1628     size_t argc = ARGS_SIZE_TWO;
1629     napi_value argv[ARGS_SIZE_TWO] = {0};
1630     napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
1631 
1632     if (argc == 0) {
1633         return true;
1634     }
1635     if (argc == ARGS_SIZE_ONE) {
1636         return ParseParaIsVerifiedWithOneParam(env, argv[PARAMZERO], asyncContext);
1637     }
1638     if (argc == ARGS_SIZE_TWO) {
1639         if (!GetCallbackProperty(env, argv[argc - 1], asyncContext->callbackRef, 1)) {
1640             ACCOUNT_LOGE("Get callbackRef failed");
1641             std::string errMsg = "Parameter error. The type of \"callback\" must be function";
1642             AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1643             return false;
1644         }
1645         napi_valuetype valueType = napi_undefined;
1646         napi_typeof(env, argv[PARAMZERO], &valueType);
1647         if ((valueType == napi_undefined) || (valueType == napi_null)) {
1648             ACCOUNT_LOGI("id is undefined or null");
1649         } else {
1650             if (!GetIntProperty(env, argv[PARAMZERO], asyncContext->id)) {
1651                 ACCOUNT_LOGE("Get id failed");
1652                 std::string errMsg = "Parameter error. The type of \"localId\" must be number";
1653                 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1654                 return false;
1655             }
1656             asyncContext->hasAccountId = true;
1657         }
1658     }
1659     return true;
1660 }
1661 
IsVerifiedExecuteCB(napi_env env,void * data)1662 void IsVerifiedExecuteCB(napi_env env, void *data)
1663 {
1664     IsVerifiedAsyncContext *asyncContext = reinterpret_cast<IsVerifiedAsyncContext *>(data);
1665     if (!asyncContext->hasAccountId) {
1666         asyncContext->errCode = OsAccountManager::IsCurrentOsAccountVerified(asyncContext->IsVerified);
1667     } else {
1668         asyncContext->errCode = OsAccountManager::IsOsAccountVerified(asyncContext->id, asyncContext->IsVerified);
1669     }
1670     // for compatibility
1671     if ((!asyncContext->throwErr) && (asyncContext->errCode == ERR_ACCOUNT_COMMON_PERMISSION_DENIED)) {
1672         asyncContext->errCode = ERR_OSACCOUNT_KIT_IS_OS_ACCOUNT_VERIFIED_ERROR;
1673     }
1674     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1675 }
1676 
IsVerifiedCompletedCB(napi_env env,napi_status status,void * data)1677 void IsVerifiedCompletedCB(napi_env env, napi_status status, void *data)
1678 {
1679     ACCOUNT_LOGD("napi_create_async_work complete");
1680     IsVerifiedAsyncContext *asyncContext = reinterpret_cast<IsVerifiedAsyncContext *>(data);
1681     napi_value errJs = nullptr;
1682     napi_value dataJs = nullptr;
1683     if (asyncContext->status == napi_ok) {
1684         errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
1685         napi_get_boolean(env, asyncContext->IsVerified, &dataJs);
1686     } else {
1687         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1688         if (asyncContext->throwErr) {
1689             napi_get_null(env, &dataJs);
1690         } else {
1691             napi_get_boolean(env, asyncContext->IsVerified, &dataJs);
1692         }
1693     }
1694     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1695     delete asyncContext;
1696 }
1697 
ParseParaSerialNumId(napi_env env,napi_callback_info cbInfo,GetSerialNumIdCBInfo * asyncContext)1698 bool ParseParaSerialNumId(napi_env env, napi_callback_info cbInfo, GetSerialNumIdCBInfo *asyncContext)
1699 {
1700     size_t argc = ARGS_SIZE_TWO;
1701     napi_value argv[ARGS_SIZE_TWO] = {0};
1702     napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
1703     if (argc == ARGS_SIZE_TWO) {
1704         if (!GetCallbackProperty(env, argv[argc - 1], asyncContext->callbackRef, 1)) {
1705             ACCOUNT_LOGE("Get callbackRef failed");
1706             std::string errMsg = "Parameter error. The type of \"callback\" must be function";
1707             AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1708             return false;
1709         }
1710     }
1711     if (!GetLongIntProperty(env, argv[PARAMZERO], asyncContext->serialNumber)) {
1712         ACCOUNT_LOGE("Get serialNumber failed");
1713         std::string errMsg = "Parameter error. The type of \"serialNumber\" must be number";
1714         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1715         return false;
1716     }
1717 
1718     return true;
1719 }
1720 
SerialNumIdExecuteCB(napi_env env,void * data)1721 void SerialNumIdExecuteCB(napi_env env, void *data)
1722 {
1723     GetSerialNumIdCBInfo *asyncContext = reinterpret_cast<GetSerialNumIdCBInfo *>(data);
1724     asyncContext->errCode =
1725         OsAccountManager::GetOsAccountLocalIdBySerialNumber(asyncContext->serialNumber, asyncContext->id);
1726     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1727 }
1728 
SerialNumIdCompletedCB(napi_env env,napi_status status,void * data)1729 void SerialNumIdCompletedCB(napi_env env, napi_status status, void *data)
1730 {
1731     GetSerialNumIdCBInfo *asyncContext = reinterpret_cast<GetSerialNumIdCBInfo *>(data);
1732     napi_value errJs = nullptr;
1733     napi_value dataJs = nullptr;
1734     if (asyncContext->status == napi_ok) {
1735         errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
1736         napi_create_int32(env, asyncContext->id, &dataJs);
1737     } else {
1738         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1739         if (asyncContext->throwErr) {
1740             napi_get_null(env, &dataJs);
1741         } else {
1742             napi_create_int32(env, asyncContext->id, &dataJs);
1743         }
1744     }
1745     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1746     delete asyncContext;
1747 }
1748 
ParseParaGetSerialNum(napi_env env,napi_callback_info cbInfo,GetSerialNumForOAInfo * asyncContext)1749 bool ParseParaGetSerialNum(napi_env env, napi_callback_info cbInfo, GetSerialNumForOAInfo *asyncContext)
1750 {
1751     return ParseCallbackAndId(env, cbInfo, asyncContext->callbackRef, asyncContext->id, asyncContext->throwErr);
1752 }
1753 
GetSerialNumExecuteCB(napi_env env,void * data)1754 void GetSerialNumExecuteCB(napi_env env, void *data)
1755 {
1756     GetSerialNumForOAInfo *asyncContext = reinterpret_cast<GetSerialNumForOAInfo *>(data);
1757     asyncContext->errCode =
1758         OsAccountManager::GetSerialNumberByOsAccountLocalId(asyncContext->id, asyncContext->serialNum);
1759     ACCOUNT_LOGD("error code is %{public}d", asyncContext->errCode);
1760     asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1761 }
1762 
GetSerialNumCompletedCB(napi_env env,napi_status status,void * data)1763 void GetSerialNumCompletedCB(napi_env env, napi_status status, void *data)
1764 {
1765     ACCOUNT_LOGD("napi_create_async_work complete");
1766     GetSerialNumForOAInfo *asyncContext = reinterpret_cast<GetSerialNumForOAInfo *>(data);
1767     napi_value errJs = nullptr;
1768     napi_value dataJs = nullptr;
1769     if (asyncContext->status == napi_ok) {
1770         errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
1771         napi_create_int64(env, asyncContext->serialNum, &dataJs);
1772     } else {
1773         errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1774         if (asyncContext->throwErr) {
1775             napi_get_null(env, &dataJs);
1776         } else {
1777             napi_create_int64(env, asyncContext->serialNum, &dataJs);
1778         }
1779     }
1780     ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1781     delete asyncContext;
1782 }
1783 
ParseParaIsTestOA(napi_env env,napi_callback_info cbInfo,IsTestOAInfo * asyncContext)1784 bool ParseParaIsTestOA(napi_env env, napi_callback_info cbInfo, IsTestOAInfo *asyncContext)
1785 {
1786     return ParseOneParaContext(env, cbInfo, asyncContext);
1787 }
1788 
ParseParaIsMainOA(napi_env env,napi_callback_info cbInfo,IsMainOAInfo * asyncContext)1789 bool ParseParaIsMainOA(napi_env env, napi_callback_info cbInfo, IsMainOAInfo *asyncContext)
1790 {
1791     return ParseOneParaContext(env, cbInfo, asyncContext);
1792 }
1793 
ParseParamForActiveSubscriber(const napi_env & env,const std::string & type,SubscribeCBInfo * asyncContext,size_t argc,napi_value * argv)1794 static bool ParseParamForActiveSubscriber(const napi_env &env, const std::string &type, SubscribeCBInfo *asyncContext,
1795                                           size_t argc, napi_value *argv)
1796 {
1797     if (argc < ARGS_SIZE_THREE) {
1798         ACCOUNT_LOGE("The arg number less than 3 characters");
1799         std::string errMsg = "Parameter error. The number of parameters should be at least 3";
1800         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1801         return false;
1802     }
1803     if (argc >= ARGS_SIZE_THREE) {
1804         if (!GetCallbackProperty(env, argv[PARAMTWO], asyncContext->callbackRef, 1)) {
1805             ACCOUNT_LOGE("Get callbackRef failed");
1806             std::string errMsg = "Parameter error. The type of \"callback\" must be function";
1807             AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1808             return false;
1809         }
1810     }
1811 
1812     // argv[0] type: 'activate' | 'activating'
1813     if (type == "activate") {
1814         asyncContext->osSubscribeType = OS_ACCOUNT_SUBSCRIBE_TYPE::ACTIVATED;
1815     } else {
1816         asyncContext->osSubscribeType = OS_ACCOUNT_SUBSCRIBE_TYPE::ACTIVATING;
1817     }
1818 
1819     // argv[1] name: string
1820     if (!GetStringProperty(env, argv[PARAMONE], asyncContext->name)) {
1821         ACCOUNT_LOGE("Get name failed");
1822         std::string errMsg = "Parameter error. The type of \"name\" must be string";
1823         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1824         return false;
1825     }
1826     size_t nameSize = asyncContext->name.size();
1827     if (nameSize == 0 || nameSize > MAX_SUBSCRIBER_NAME_LEN) {
1828         ACCOUNT_LOGE("Subscriber name size %{public}zu is invalid.", nameSize);
1829         std::string errMsg = "Parameter error. The length of \"name\" is invalid";
1830         AccountNapiThrow(env, ERR_JS_INVALID_PARAMETER, errMsg, asyncContext->throwErr);
1831         return false;
1832     }
1833 
1834     return true;
1835 }
1836 
ParseParamForSwitchSubscriber(const napi_env & env,const std::string & type,SubscribeCBInfo * asyncContext,size_t argc,napi_value * argv)1837 static bool ParseParamForSwitchSubscriber(const napi_env &env, const std::string &type, SubscribeCBInfo *asyncContext,
1838                                           size_t argc, napi_value *argv)
1839 {
1840     if (argc < ARGS_SIZE_TWO) {
1841         ACCOUNT_LOGE("The number of parameters should be at least 2");
1842         std::string errMsg = "Parameter error. The number of parameters should be at least 2";
1843         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1844         return false;
1845     }
1846     if (argc >= ARGS_SIZE_TWO) {
1847         if (!GetCallbackProperty(env, argv[PARAMONE], asyncContext->callbackRef, 1)) {
1848             ACCOUNT_LOGE("Get callbackRef failed");
1849             std::string errMsg = "Parameter error. The type of \"callback\" must be function";
1850             AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1851             return false;
1852         }
1853     }
1854     // argv[0] type: 'switched' | 'switching'
1855     if (type == "switched") {
1856         asyncContext->osSubscribeType = OS_ACCOUNT_SUBSCRIBE_TYPE::SWITCHED;
1857     } else {
1858         asyncContext->osSubscribeType = OS_ACCOUNT_SUBSCRIBE_TYPE::SWITCHING;
1859     }
1860 
1861     return true;
1862 }
1863 
ParseParaToSubscriber(const napi_env & env,napi_callback_info cbInfo,SubscribeCBInfo * asyncContext,napi_value * thisVar)1864 bool ParseParaToSubscriber(const napi_env &env, napi_callback_info cbInfo, SubscribeCBInfo *asyncContext,
1865                            napi_value *thisVar)
1866 {
1867     size_t argc = ARGS_SIZE_THREE;
1868     napi_value argv[ARGS_SIZE_THREE] = {nullptr};
1869     NAPI_CALL_BASE(env, napi_get_cb_info(env, cbInfo, &argc, argv, thisVar, NULL), false);
1870     if (argc < ARGS_SIZE_TWO) {
1871         ACCOUNT_LOGE("The number of parameters should be at least 2");
1872         std::string errMsg = "Parameter error. The number of parameters should be at least 2";
1873         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1874         return false;
1875     }
1876     std::string type;
1877     if (!GetStringProperty(env, argv[PARAMZERO], type)) {
1878         ACCOUNT_LOGE("Get type failed.");
1879         std::string errMsg = "Parameter error. The type of \"type\" must be string";
1880         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1881         return false;
1882     }
1883     if ((type == "activate" || type == "activating")) {
1884         return ParseParamForActiveSubscriber(env, type, asyncContext, argc, argv);
1885     }
1886     if (type == "switched" || type == "switching") {
1887         return ParseParamForSwitchSubscriber(env, type, asyncContext, argc, argv);
1888     }
1889     ACCOUNT_LOGE("Get type fail, %{public}s is invalid.", type.c_str());
1890     std::string errMsg = "Parameter error. The content of \"type\" must be \"activate|activating|switched|switching\"";
1891     AccountNapiThrow(env, ERR_JS_INVALID_PARAMETER, errMsg, asyncContext->throwErr);
1892     return false;
1893 }
1894 
ParseParamForActiveUnsubscriber(const napi_env & env,const std::string & type,UnsubscribeCBInfo * asyncContext,size_t argc,napi_value * argv)1895 static bool ParseParamForActiveUnsubscriber(const napi_env &env, const std::string &type,
1896                                             UnsubscribeCBInfo *asyncContext, size_t argc, napi_value *argv)
1897 {
1898     if (argc < ARGS_SIZE_TWO) {
1899         ACCOUNT_LOGE("The arg number less than 2 characters.");
1900         std::string errMsg = "The arg number must be at least 2 characters";
1901         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1902         return false;
1903     }
1904     if (argc >= ARGS_SIZE_THREE) {
1905         if (!GetCallbackProperty(env, argv[PARAMTWO], asyncContext->callbackRef, 1)) {
1906             ACCOUNT_LOGE("Get callbackRef failed.");
1907             std::string errMsg = "The type of arg " + std::to_string(PARAMTWO + 1) + " must be function";
1908             AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1909             return false;
1910         }
1911     }
1912 
1913     // argv[0] type: 'activate' | 'activating'
1914     if (type == "activate") {
1915         asyncContext->osSubscribeType = OS_ACCOUNT_SUBSCRIBE_TYPE::ACTIVATED;
1916     } else {
1917         asyncContext->osSubscribeType = OS_ACCOUNT_SUBSCRIBE_TYPE::ACTIVATING;
1918     }
1919 
1920     // argv[1] name: string
1921     if (!GetStringProperty(env, argv[PARAMONE], asyncContext->name)) {
1922         ACCOUNT_LOGE("Get name failed");
1923         std::string errMsg = "The type of arg 2 must be string";
1924         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1925         return false;
1926     }
1927     size_t nameSize = asyncContext->name.size();
1928     if (nameSize == 0 || nameSize > MAX_SUBSCRIBER_NAME_LEN) {
1929         ACCOUNT_LOGE("Subscriber name size %{public}zu is invalid.", nameSize);
1930         std::string errMsg = "The length of arg 2 is invalid";
1931         AccountNapiThrow(env, ERR_JS_INVALID_PARAMETER, errMsg, asyncContext->throwErr);
1932         return false;
1933     }
1934 
1935     return true;
1936 }
1937 
ParseParamForSwitchUnsubscriber(const napi_env & env,const std::string & type,UnsubscribeCBInfo * asyncContext,size_t argc,napi_value * argv)1938 static bool ParseParamForSwitchUnsubscriber(const napi_env &env, const std::string &type,
1939                                             UnsubscribeCBInfo *asyncContext, size_t argc, napi_value *argv)
1940 {
1941     if (argc < ARGS_SIZE_ONE) {
1942         ACCOUNT_LOGE("The arg number less than 1 characters.");
1943         std::string errMsg = "The arg number must be at least 1 characters";
1944         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1945         return false;
1946     }
1947     if (argc >= ARGS_SIZE_TWO) {
1948         if (!GetCallbackProperty(env, argv[PARAMONE], asyncContext->callbackRef, 1)) {
1949             ACCOUNT_LOGE("Get callbackRef failed.");
1950             std::string errMsg = "The type of arg " + std::to_string(PARAMONE + 1) + " must be function";
1951             AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1952             return false;
1953         }
1954     }
1955     // argv[0] type: 'switched' | 'switching'
1956     if (type == "switched") {
1957         asyncContext->osSubscribeType = OS_ACCOUNT_SUBSCRIBE_TYPE::SWITCHED;
1958     } else {
1959         asyncContext->osSubscribeType = OS_ACCOUNT_SUBSCRIBE_TYPE::SWITCHING;
1960     }
1961 
1962     return true;
1963 }
1964 
ParseParaToUnsubscriber(const napi_env & env,napi_callback_info cbInfo,UnsubscribeCBInfo * asyncContext,napi_value * thisVar)1965 bool ParseParaToUnsubscriber(const napi_env &env, napi_callback_info cbInfo, UnsubscribeCBInfo *asyncContext,
1966                              napi_value *thisVar)
1967 {
1968     size_t argc = ARGS_SIZE_THREE;
1969     napi_value argv[ARGS_SIZE_THREE] = {nullptr};
1970     NAPI_CALL_BASE(env, napi_get_cb_info(env, cbInfo, &argc, argv, thisVar, NULL), false);
1971     if (argc < ARGS_SIZE_ONE) {
1972         ACCOUNT_LOGE("The arg number less than 1 characters.");
1973         std::string errMsg = "Parameter error. The number of parameters should be at least 1";
1974         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1975         return false;
1976     }
1977     std::string type;
1978     if (!GetStringProperty(env, argv[PARAMZERO], type)) {
1979         ACCOUNT_LOGE("Get type failed.");
1980         std::string errMsg = "Parameter error. The type of \"type\" must be string";
1981         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1982         return false;
1983     }
1984     if ((type == "activate" || type == "activating")) {
1985         return ParseParamForActiveUnsubscriber(env, type, asyncContext, argc, argv);
1986     }
1987     if (type == "switched" || type == "switching") {
1988         return ParseParamForSwitchUnsubscriber(env, type, asyncContext, argc, argv);
1989     }
1990     ACCOUNT_LOGE("Get type fail, %{public}s is invalid.", type.c_str());
1991     std::string errMsg = "Parameter error. The content of \"type\" must be \"activate|activating|switched|switching\"";
1992     AccountNapiThrow(env, ERR_JS_INVALID_PARAMETER, errMsg, asyncContext->throwErr);
1993     return false;
1994 }
1995 
GetOsAccountDomainInfoExecuteCB(napi_env env,void * data)1996 void GetOsAccountDomainInfoExecuteCB(napi_env env, void *data)
1997 {
1998     GetOsAccountDomainInfoAsyncContext* asyncContext =
1999         reinterpret_cast<GetOsAccountDomainInfoAsyncContext *>(data);
2000     asyncContext->errCode = OsAccountManager::GetOsAccountDomainInfo(asyncContext->id, asyncContext->domainInfo);
2001 }
2002 
GetOsAccountDomainInfoCompletedCB(napi_env env,napi_status status,void * data)2003 void GetOsAccountDomainInfoCompletedCB(napi_env env, napi_status status, void *data)
2004 {
2005     GetOsAccountDomainInfoAsyncContext* contextPtr =
2006         reinterpret_cast<GetOsAccountDomainInfoAsyncContext *>(data);
2007     std::unique_ptr<GetOsAccountDomainInfoAsyncContext> asyncContext(contextPtr);
2008 
2009     napi_value errJs = nullptr;
2010     napi_value dataJs = nullptr;
2011     if (asyncContext->errCode == ERR_OK) {
2012         errJs = GenerateBusinessSuccess(env, true);
2013         CreateJsDomainInfo(env, asyncContext->domainInfo, dataJs);
2014     } else {
2015         // If local account exists but no domain info, need return success, but info is null.
2016         if (asyncContext->errCode == ERR_DOMAIN_ACCOUNT_SERVICE_NOT_DOMAIN_ACCOUNT) {
2017             errJs = GenerateBusinessSuccess(env, false);
2018             asyncContext->errCode = ERR_OK;
2019         } else {
2020             errJs = GenerateBusinessError(env, asyncContext->errCode, true);
2021         }
2022         napi_get_null(env, &dataJs);
2023     }
2024     ProcessCallbackOrPromise(env, contextPtr, errJs, dataJs);
2025 }
2026 
OnResult(const int32_t errCode,Parcel & parcel)2027 void NapiBindDomainCallback::OnResult(const int32_t errCode, Parcel &parcel)
2028 {
2029     std::unique_lock<std::mutex> lock(lockInfo_.mutex);
2030     if (env_ == nullptr || deferred_ == nullptr) {
2031         ACCOUNT_LOGE("Js promise or env is nullptr");
2032         return;
2033     }
2034     std::shared_ptr<BindDomainAccountAsyncContext> asyncContext = std::make_shared<BindDomainAccountAsyncContext>();
2035     asyncContext->env = env_;
2036     asyncContext->deferred = deferred_;
2037     asyncContext->errCode = errCode;
2038     if (napi_ok != napi_send_event(env_, BindDomainAccountCompleteWork(asyncContext), napi_eprio_vip)) {
2039         ACCOUNT_LOGE("Post task failed");
2040         return;
2041     }
2042     deferred_ = nullptr;
2043     ACCOUNT_LOGI("Post task finish");
2044 }
2045 
ParseParaBindDomainAccount(napi_env env,napi_callback_info cbInfo,std::unique_ptr<BindDomainAccountAsyncContext> & asyncContext)2046 bool ParseParaBindDomainAccount(
2047     napi_env env, napi_callback_info cbInfo, std::unique_ptr<BindDomainAccountAsyncContext> &asyncContext)
2048 {
2049     size_t argc = ARGS_SIZE_TWO;
2050     napi_value argv[ARGS_SIZE_TWO] = {0};
2051     napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
2052 
2053     if (!GetIntProperty(env, argv[PARAMZERO], asyncContext->localID)) {
2054         ACCOUNT_LOGE("Get localId failed");
2055         std::string errMsg = "Parameter error. The type of \"localId\" must be integer.";
2056         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, true);
2057         return false;
2058     }
2059 
2060     if (!ParseDomainAccountInfo(env, argv[PARAMONE], asyncContext->domainInfo)) {
2061         ACCOUNT_LOGE("Get domainInfo failed");
2062         std::string errMsg = "Parameter error. The type of \"domainInfo\" must be DomainAccountInfo.";
2063         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, true);
2064         return false;
2065     }
2066     return true;
2067 }
2068 
BindDomainAccountExecuteCB(napi_env env,void * data)2069 void BindDomainAccountExecuteCB(napi_env env, void *data)
2070 {
2071     BindDomainAccountAsyncContext *asyncContext = reinterpret_cast<BindDomainAccountAsyncContext *>(data);
2072     std::shared_ptr<NapiBindDomainCallback> callback = std::make_shared<NapiBindDomainCallback>(
2073         asyncContext->env, asyncContext->deferred);
2074     asyncContext->errCode = OsAccountManager::BindDomainAccount(
2075         asyncContext->localID, asyncContext->domainInfo, callback);
2076     if (asyncContext->errCode != ERR_OK) {
2077         Parcel emptyParcel;
2078         callback->OnResult(asyncContext->errCode, emptyParcel);
2079     }
2080     asyncContext->deferred = nullptr;
2081 }
2082 
BindDomainAccountCompletedCB(napi_env env,napi_status status,void * data)2083 void BindDomainAccountCompletedCB(napi_env env, napi_status status, void *data)
2084 {
2085     BindDomainAccountAsyncContext *asyncContext = reinterpret_cast<BindDomainAccountAsyncContext *>(data);
2086     delete asyncContext;
2087 }
2088 
BindDomainAccountCompleteWork(const std::shared_ptr<BindDomainAccountAsyncContext> & param)2089 std::function<void()> BindDomainAccountCompleteWork(const std::shared_ptr<BindDomainAccountAsyncContext> &param)
2090 {
2091     return [asyncContext = param] {
2092         ACCOUNT_LOGI("Enter BindDomainAccountCompleteWork");
2093         napi_handle_scope scope = nullptr;
2094         napi_open_handle_scope(asyncContext->env, &scope);
2095         if (scope == nullptr) {
2096             ACCOUNT_LOGE("Fail to open scope");
2097             return;
2098         }
2099         napi_value errJs = nullptr;
2100         napi_value dataJs = nullptr;
2101         napi_get_undefined(asyncContext->env, &dataJs);
2102         if (asyncContext->errCode != ERR_OK) {
2103             errJs = GenerateBusinessError(asyncContext->env, asyncContext->errCode);
2104         } else {
2105             errJs = GenerateBusinessSuccess(asyncContext->env, true);
2106         }
2107         ReturnCallbackOrPromise(asyncContext->env, asyncContext.get(), errJs, dataJs);
2108         napi_close_handle_scope(asyncContext->env, scope);
2109     };
2110 }
2111 }  // namespace AccountJsKit
2112 }  // namespace OHOS
2113