1 /*
2 * Copyright (c) 2023-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 #include "usb_manager_addon.h"
16
17 #include "edm_log.h"
18 #include "usb_manager_proxy.h"
19
20 #include "napi_edm_adapter.h"
21
22 using namespace OHOS::EDM;
23
Init(napi_env env,napi_value exports)24 napi_value UsbManagerAddon::Init(napi_env env, napi_value exports)
25 {
26 napi_value policyValue = nullptr;
27 NAPI_CALL(env, napi_create_object(env, &policyValue));
28 CreateUsbPolicyEnum(env, policyValue);
29
30 napi_value descriptorValue = nullptr;
31 NAPI_CALL(env, napi_create_object(env, &descriptorValue));
32 CreateDescriptorEnum(env, descriptorValue);
33
34 napi_property_descriptor property[] = {
35 DECLARE_NAPI_PROPERTY("UsbPolicy", policyValue),
36 DECLARE_NAPI_PROPERTY("Descriptor", descriptorValue),
37 DECLARE_NAPI_FUNCTION("setUsbPolicy", SetUsbPolicy),
38 DECLARE_NAPI_FUNCTION("disableUsb", DisableUsb),
39 DECLARE_NAPI_FUNCTION("isUsbDisabled", IsUsbDisabled),
40 DECLARE_NAPI_FUNCTION("addAllowedUsbDevices", AddAllowedUsbDevices),
41 DECLARE_NAPI_FUNCTION("removeAllowedUsbDevices", RemoveAllowedUsbDevices),
42 DECLARE_NAPI_FUNCTION("getAllowedUsbDevices", GetAllowedUsbDevices),
43 DECLARE_NAPI_FUNCTION("setUsbStorageDeviceAccessPolicy", SetUsbStorageDeviceAccessPolicy),
44 DECLARE_NAPI_FUNCTION("getUsbStorageDeviceAccessPolicy", GetUsbStorageDeviceAccessPolicy),
45 DECLARE_NAPI_FUNCTION("addDisallowedUsbDevices", AddDisallowedUsbDevices),
46 DECLARE_NAPI_FUNCTION("removeDisallowedUsbDevices", RemoveDisallowedUsbDevices),
47 DECLARE_NAPI_FUNCTION("getDisallowedUsbDevices", GetDisallowedUsbDevices),
48 };
49 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(property) / sizeof(property[0]), property));
50 return exports;
51 }
52
CreateUsbPolicyEnum(napi_env env,napi_value value)53 void UsbManagerAddon::CreateUsbPolicyEnum(napi_env env, napi_value value)
54 {
55 napi_value readWrite;
56 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, EdmConstants::STORAGE_USB_POLICY_READ_WRITE, &readWrite));
57 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "READ_WRITE", readWrite));
58
59 napi_value readOnly;
60 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, EdmConstants::STORAGE_USB_POLICY_READ_ONLY, &readOnly));
61 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "READ_ONLY", readOnly));
62
63 napi_value disabled;
64 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, EdmConstants::STORAGE_USB_POLICY_DISABLED, &disabled));
65 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DISABLED", disabled));
66 }
67
CreateDescriptorEnum(napi_env env,napi_value value)68 void UsbManagerAddon::CreateDescriptorEnum(napi_env env, napi_value value)
69 {
70 napi_value interfaceDescriptor;
71 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, EdmConstants::USB_INTERFACE_DESCRIPTOR, &interfaceDescriptor));
72 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "INTERFACE", interfaceDescriptor));
73
74 napi_value deviceDescriptor;
75 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, EdmConstants::USB_DEVICE_DESCRIPTOR, &deviceDescriptor));
76 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DEVICE", deviceDescriptor));
77 }
78
SetUsbPolicy(napi_env env,napi_callback_info info)79 napi_value UsbManagerAddon::SetUsbPolicy(napi_env env, napi_callback_info info)
80 {
81 auto convertpolicy2Data = [](napi_env env, napi_value argv, MessageParcel &data,
82 const AddonMethodSign &methodSign) -> bool {
83 bool usbPolicy = MatchValueType(env, argv, napi_number);
84 if (!usbPolicy) {
85 EDMLOGE("type usbPolicy error");
86 return false;
87 }
88 int32_t policy = EdmConstants::STORAGE_USB_POLICY_DISABLED;
89 if (!ParseInt(env, policy, argv)) {
90 EDMLOGE("policy param error");
91 return false;
92 }
93 const int32_t readOnly = 1;
94 const int32_t readWrite = 0;
95 switch (policy) {
96 case EdmConstants::STORAGE_USB_POLICY_READ_WRITE:
97 data.WriteInt32(readWrite);
98 break;
99 case EdmConstants::STORAGE_USB_POLICY_READ_ONLY:
100 data.WriteInt32(readOnly);
101 break;
102 default:
103 return false;
104 }
105 return true;
106 };
107 AddonMethodSign addonMethodSign;
108 addonMethodSign.name = "setUsbPolicy";
109 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::CUSTOM};
110 addonMethodSign.argsConvert = {nullptr, convertpolicy2Data};
111 addonMethodSign.methodAttribute = MethodAttribute::HANDLE;
112 return AddonMethodAdapter(env, info, addonMethodSign, NativeSetUsbPolicy, NativeVoidCallbackComplete);
113 }
114
NativeSetUsbPolicy(napi_env env,void * data)115 void UsbManagerAddon::NativeSetUsbPolicy(napi_env env, void *data)
116 {
117 EDMLOGI("NAPI_NativeSetUsbPolicy called");
118 if (data == nullptr) {
119 EDMLOGE("data is nullptr");
120 return;
121 }
122 AdapterAddonData *asyncCallbackInfo = static_cast<AdapterAddonData *>(data);
123 asyncCallbackInfo->ret =
124 UsbManagerProxy::GetUsbManagerProxy()->SetUsbReadOnly(asyncCallbackInfo->data);
125 }
126
DisableUsb(napi_env env,napi_callback_info info)127 napi_value UsbManagerAddon::DisableUsb(napi_env env, napi_callback_info info)
128 {
129 AddonMethodSign addonMethodSign;
130 addonMethodSign.name = "disableUsb";
131 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::BOOLEAN};
132 addonMethodSign.methodAttribute = MethodAttribute::HANDLE;
133 addonMethodSign.apiVersionTag = EdmConstants::PERMISSION_TAG_VERSION_11;
134 AdapterAddonData adapterAddonData{};
135 napi_value result = JsObjectToData(env, info, addonMethodSign, &adapterAddonData);
136 if (result == nullptr) {
137 return nullptr;
138 }
139
140 auto usbManagerProxy = UsbManagerProxy::GetUsbManagerProxy();
141 if (usbManagerProxy == nullptr) {
142 EDMLOGE("can not get usbManagerProxy");
143 return nullptr;
144 }
145 int32_t ret = usbManagerProxy->DisableUsb(adapterAddonData.data);
146 if (FAILED(ret)) {
147 napi_throw(env, CreateError(env, ret));
148 }
149 return nullptr;
150 }
151
IsUsbDisabled(napi_env env,napi_callback_info info)152 napi_value UsbManagerAddon::IsUsbDisabled(napi_env env, napi_callback_info info)
153 {
154 AddonMethodSign addonMethodSign;
155 addonMethodSign.name = "isUsbDisabled";
156 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT_NULL};
157 addonMethodSign.methodAttribute = MethodAttribute::GET;
158 addonMethodSign.apiVersionTag = EdmConstants::PERMISSION_TAG_VERSION_11;
159 AdapterAddonData adapterAddonData{};
160 napi_value result = JsObjectToData(env, info, addonMethodSign, &adapterAddonData);
161 if (result == nullptr) {
162 return nullptr;
163 }
164 bool isDisabled = false;
165 int32_t ret = ERR_OK;
166 ret = UsbManagerProxy::GetUsbManagerProxy()->IsUsbDisabled(adapterAddonData.data, isDisabled);
167 EDMLOGI("UsbManagerAddon::IsUsbDisabled return: %{public}d", isDisabled);
168 if (FAILED(ret)) {
169 napi_throw(env, CreateError(env, ret));
170 return nullptr;
171 }
172 result = nullptr;
173 NAPI_CALL(env, napi_get_boolean(env, isDisabled, &result));
174 return result;
175 }
176
AddAllowedUsbDevices(napi_env env,napi_callback_info info)177 napi_value UsbManagerAddon::AddAllowedUsbDevices(napi_env env, napi_callback_info info)
178 {
179 EDMLOGI("UsbManagerAddon::AddAllowedUsbDevices called");
180 return AddOrRemoveAllowedUsbDevices(env, info, true);
181 }
182
RemoveAllowedUsbDevices(napi_env env,napi_callback_info info)183 napi_value UsbManagerAddon::RemoveAllowedUsbDevices(napi_env env, napi_callback_info info)
184 {
185 EDMLOGI("UsbManagerAddon::RemoveAllowedUsbDevices called");
186 return AddOrRemoveAllowedUsbDevices(env, info, false);
187 }
188
AddOrRemoveAllowedUsbDevices(napi_env env,napi_callback_info info,bool isAdd)189 napi_value UsbManagerAddon::AddOrRemoveAllowedUsbDevices(napi_env env, napi_callback_info info, bool isAdd)
190 {
191 auto convertUsbDeviceIds2Data = [](napi_env env, napi_value argv, MessageParcel &data,
192 const AddonMethodSign &methodSign) {
193 std::vector<UsbDeviceId> usbDeviceIds;
194 if (!ParseUsbDevicesArray(env, usbDeviceIds, argv)) {
195 EDMLOGE("parameter type parse error");
196 return false;
197 }
198 data.WriteUint32(usbDeviceIds.size());
199 for (const auto &usbDeviceId : usbDeviceIds) {
200 if (!usbDeviceId.Marshalling(data)) {
201 EDMLOGE("UsbManagerProxy AddAllowedUsbDevices: write parcel failed!");
202 return false;
203 }
204 }
205 return true;
206 };
207 AddonMethodSign addonMethodSign;
208 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::CUSTOM};
209 addonMethodSign.argsConvert = {nullptr, convertUsbDeviceIds2Data};
210 addonMethodSign.methodAttribute = MethodAttribute::HANDLE;
211 addonMethodSign.name = (isAdd ? "addAllowedUsbDevices" : "removeAllowedUsbDevices");
212 AdapterAddonData adapterAddonData{};
213 napi_value result = JsObjectToData(env, info, addonMethodSign, &adapterAddonData);
214 if (result == nullptr) {
215 return nullptr;
216 }
217 auto usbManagerProxy = UsbManagerProxy::GetUsbManagerProxy();
218 if (usbManagerProxy == nullptr) {
219 EDMLOGE("can not get usbManagerProxy");
220 return nullptr;
221 }
222 int32_t ret = ERR_OK;
223 if (isAdd) {
224 ret = usbManagerProxy->AddAllowedUsbDevices(adapterAddonData.data);
225 } else {
226 ret = usbManagerProxy->RemoveAllowedUsbDevices(adapterAddonData.data);
227 }
228 if (FAILED(ret)) {
229 napi_throw(env, CreateError(env, ret));
230 }
231 return nullptr;
232 }
233
ParseUsbDevicesArray(napi_env env,std::vector<UsbDeviceId> & usbDeviceIds,napi_value object)234 bool UsbManagerAddon::ParseUsbDevicesArray(napi_env env, std::vector<UsbDeviceId> &usbDeviceIds, napi_value object)
235 {
236 bool isArray = false;
237 napi_is_array(env, object, &isArray);
238 if (!isArray) {
239 return false;
240 }
241 uint32_t arrayLength = 0;
242 napi_get_array_length(env, object, &arrayLength);
243 for (uint32_t i = 0; i < arrayLength; i++) {
244 napi_value value = nullptr;
245 napi_get_element(env, object, i, &value);
246 napi_valuetype valueType = napi_undefined;
247 napi_typeof(env, value, &valueType);
248 if (valueType != napi_object) {
249 usbDeviceIds.clear();
250 return false;
251 }
252 UsbDeviceId usbDeviceId;
253 if (!GetUsbDeviceIdFromNAPI(env, value, usbDeviceId)) {
254 usbDeviceIds.clear();
255 return false;
256 }
257 usbDeviceIds.push_back(usbDeviceId);
258 }
259 return true;
260 }
261
GetUsbDeviceIdFromNAPI(napi_env env,napi_value value,UsbDeviceId & usbDeviceId)262 bool UsbManagerAddon::GetUsbDeviceIdFromNAPI(napi_env env, napi_value value, UsbDeviceId &usbDeviceId)
263 {
264 int32_t vendorId = 0;
265 if (!JsObjectToInt(env, value, "vendorId", true, vendorId)) {
266 EDMLOGE("Add/RemoveAllowedUsbDevices vendorId parse error!");
267 return false;
268 }
269 int32_t productId = 0;
270 if (!JsObjectToInt(env, value, "productId", true, productId)) {
271 EDMLOGE("Add/RemoveAllowedUsbDevices productId parse error!");
272 return false;
273 }
274 usbDeviceId.SetVendorId(vendorId);
275 usbDeviceId.SetProductId(productId);
276 EDMLOGD("GetUsbDeviceIdFromNAPI vendorId: %{public}d, productId: %{public}d", vendorId, productId);
277 return true;
278 }
279
GetAllowedUsbDevices(napi_env env,napi_callback_info info)280 napi_value UsbManagerAddon::GetAllowedUsbDevices(napi_env env, napi_callback_info info)
281 {
282 AddonMethodSign addonMethodSign;
283 addonMethodSign.name = "getAllowedUsbDevices";
284 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT};
285 addonMethodSign.methodAttribute = MethodAttribute::GET;
286 AdapterAddonData adapterAddonData{};
287 napi_value result = JsObjectToData(env, info, addonMethodSign, &adapterAddonData);
288 if (result == nullptr) {
289 return nullptr;
290 }
291
292 auto usbManagerProxy = UsbManagerProxy::GetUsbManagerProxy();
293 if (usbManagerProxy == nullptr) {
294 EDMLOGE("can not get usbManagerProxy");
295 return nullptr;
296 }
297 std::vector<UsbDeviceId> usbDeviceIds;
298 int32_t ret = usbManagerProxy->GetAllowedUsbDevices(adapterAddonData.data, usbDeviceIds);
299 EDMLOGI("UsbManagerAddon::GetAllowedUsbDevices usbDeviceIds return size: %{public}zu", usbDeviceIds.size());
300 if (FAILED(ret)) {
301 napi_throw(env, CreateError(env, ret));
302 return nullptr;
303 }
304 napi_value jsList = nullptr;
305 NAPI_CALL(env, napi_create_array_with_length(env, usbDeviceIds.size(), &jsList));
306 for (size_t i = 0; i < usbDeviceIds.size(); i++) {
307 napi_value item = UsbDeviceIdToJsObj(env, usbDeviceIds[i]);
308 NAPI_CALL(env, napi_set_element(env, jsList, i, item));
309 }
310 return jsList;
311 }
312
UsbDeviceIdToJsObj(napi_env env,const UsbDeviceId & usbDeviceId)313 napi_value UsbManagerAddon::UsbDeviceIdToJsObj(napi_env env, const UsbDeviceId &usbDeviceId)
314 {
315 napi_value value = nullptr;
316 NAPI_CALL(env, napi_create_object(env, &value));
317
318 napi_value vendorId = nullptr;
319 NAPI_CALL(env, napi_create_int32(env, usbDeviceId.GetVendorId(), &vendorId));
320 NAPI_CALL(env, napi_set_named_property(env, value, "vendorId", vendorId));
321
322 napi_value productId = nullptr;
323 NAPI_CALL(env, napi_create_int32(env, usbDeviceId.GetProductId(), &productId));
324 NAPI_CALL(env, napi_set_named_property(env, value, "productId", productId));
325
326 return value;
327 }
328
SetUsbStorageDeviceAccessPolicy(napi_env env,napi_callback_info info)329 napi_value UsbManagerAddon::SetUsbStorageDeviceAccessPolicy(napi_env env, napi_callback_info info)
330 {
331 AddonMethodSign addonMethodSign;
332 addonMethodSign.name = "setUsbStorageDeviceAccessPolicy";
333 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::INT32};
334 addonMethodSign.methodAttribute = MethodAttribute::HANDLE;
335 AdapterAddonData adapterAddonData{};
336 napi_value result = JsObjectToData(env, info, addonMethodSign, &adapterAddonData);
337 if (result == nullptr) {
338 return nullptr;
339 }
340
341 auto usbManagerProxy = UsbManagerProxy::GetUsbManagerProxy();
342 if (usbManagerProxy == nullptr) {
343 EDMLOGE("can not get usbManagerProxy");
344 return nullptr;
345 }
346 int32_t ret = usbManagerProxy->SetUsbStorageDeviceAccessPolicy(adapterAddonData.data);
347 if (FAILED(ret)) {
348 napi_throw(env, CreateError(env, ret));
349 }
350 return nullptr;
351 }
352
GetUsbStorageDeviceAccessPolicy(napi_env env,napi_callback_info info)353 napi_value UsbManagerAddon::GetUsbStorageDeviceAccessPolicy(napi_env env, napi_callback_info info)
354 {
355 AddonMethodSign addonMethodSign;
356 addonMethodSign.name = "getUsbStorageDeviceAccessPolicy";
357 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT};
358 addonMethodSign.methodAttribute = MethodAttribute::GET;
359 AdapterAddonData adapterAddonData{};
360 napi_value result = JsObjectToData(env, info, addonMethodSign, &adapterAddonData);
361 if (result == nullptr) {
362 return nullptr;
363 }
364
365 int32_t usbPolicy = EdmConstants::STORAGE_USB_POLICY_READ_WRITE;
366 auto usbManagerProxy = UsbManagerProxy::GetUsbManagerProxy();
367 if (usbManagerProxy == nullptr) {
368 EDMLOGE("can not get usbManagerProxy");
369 return nullptr;
370 }
371 int32_t ret = usbManagerProxy->GetUsbStorageDeviceAccessPolicy(adapterAddonData.data, usbPolicy);
372 EDMLOGI("UsbManagerAddon::GetUsbStorageDeviceAccessPolicy return: %{public}d", usbPolicy);
373 if (FAILED(ret)) {
374 napi_throw(env, CreateError(env, ret));
375 return nullptr;
376 }
377 result = nullptr;
378 NAPI_CALL(env, napi_create_int32(env, usbPolicy, &result));
379 return result;
380 }
381
AddDisallowedUsbDevices(napi_env env,napi_callback_info info)382 napi_value UsbManagerAddon::AddDisallowedUsbDevices(napi_env env, napi_callback_info info)
383 {
384 EDMLOGI("UsbManagerAddon::AddDisallowedUsbDevices called");
385 return AddOrRemoveDisallowedUsbDevices(env, info, true);
386 }
387
RemoveDisallowedUsbDevices(napi_env env,napi_callback_info info)388 napi_value UsbManagerAddon::RemoveDisallowedUsbDevices(napi_env env, napi_callback_info info)
389 {
390 EDMLOGI("UsbManagerAddon::RemoveDisallowedUsbDevices called");
391 return AddOrRemoveDisallowedUsbDevices(env, info, false);
392 }
393
AddOrRemoveDisallowedUsbDevices(napi_env env,napi_callback_info info,bool isAdd)394 napi_value UsbManagerAddon::AddOrRemoveDisallowedUsbDevices(napi_env env, napi_callback_info info, bool isAdd)
395 {
396 auto convertUsbDeviceType2Data = [](napi_env env, napi_value argv, MessageParcel &data,
397 const AddonMethodSign &methodSign) {
398 std::vector<USB::UsbDeviceType> usbDeviceTypes;
399 if (!ParseUsbDeviceTypesArray(env, usbDeviceTypes, argv)) {
400 EDMLOGE("parameter type parse error");
401 return false;
402 }
403 auto size = usbDeviceTypes.size();
404 if (size > EdmConstants::DISALLOWED_USB_DEVICES_TYPES_MAX_SIZE) {
405 EDMLOGE("UsbManagerProxy:AddOrRemoveDisallowedUsbDevices size=[%{public}zu] is too large", size);
406 return false;
407 }
408 data.WriteUint32(size);
409 for (const auto &usbDeviceType : usbDeviceTypes) {
410 if (!usbDeviceType.Marshalling(data)) {
411 EDMLOGE("UsbManagerProxy AddOrRemoveDisallowedUsbDevices: write parcel failed!");
412 return false;
413 }
414 }
415 return true;
416 };
417 AddonMethodSign addonMethodSign;
418 addonMethodSign.name = (isAdd ? "addDisallowedUsbDevices" : "removeDisallowedUsbDevices");
419 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::CUSTOM};
420 addonMethodSign.argsConvert = {nullptr, convertUsbDeviceType2Data};
421 addonMethodSign.methodAttribute = MethodAttribute::HANDLE;
422 AdapterAddonData adapterAddonData{};
423 napi_value result = JsObjectToData(env, info, addonMethodSign, &adapterAddonData);
424 if (result == nullptr) {
425 return nullptr;
426 }
427
428 auto usbManagerProxy = UsbManagerProxy::GetUsbManagerProxy();
429 if (usbManagerProxy == nullptr) {
430 EDMLOGE("can not get usbManagerProxy");
431 return nullptr;
432 }
433 int32_t ret = usbManagerProxy->AddOrRemoveDisallowedUsbDevices(adapterAddonData.data, isAdd);
434 if (FAILED(ret)) {
435 napi_throw(env, CreateError(env, ret));
436 }
437 return nullptr;
438 }
439
GetDisallowedUsbDevices(napi_env env,napi_callback_info info)440 napi_value UsbManagerAddon::GetDisallowedUsbDevices(napi_env env, napi_callback_info info)
441 {
442 EDMLOGI("UsbManagerAddon::GetDisallowedUsbDevices called");
443 AddonMethodSign addonMethodSign;
444 addonMethodSign.name = "getDisallowedUsbDevices";
445 addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT};
446 addonMethodSign.methodAttribute = MethodAttribute::GET;
447 AdapterAddonData adapterAddonData{};
448 napi_value result = JsObjectToData(env, info, addonMethodSign, &adapterAddonData);
449 if (result == nullptr) {
450 return nullptr;
451 }
452
453 auto usbManagerProxy = UsbManagerProxy::GetUsbManagerProxy();
454 if (usbManagerProxy == nullptr) {
455 EDMLOGE("can not get usbManagerProxy");
456 return nullptr;
457 }
458 std::vector<USB::UsbDeviceType> usbDeviceTypes;
459 int32_t ret = usbManagerProxy->GetDisallowedUsbDevices(adapterAddonData.data, usbDeviceTypes);
460 EDMLOGI("UsbManagerAddon::GetDisallowedUsbDevices usbDeviceTypes return size: %{public}zu", usbDeviceTypes.size());
461 if (FAILED(ret)) {
462 napi_throw(env, CreateError(env, ret));
463 return nullptr;
464 }
465 napi_value jsList = nullptr;
466 NAPI_CALL(env, napi_create_array_with_length(env, usbDeviceTypes.size(), &jsList));
467 for (size_t i = 0; i < usbDeviceTypes.size(); i++) {
468 napi_value item = UsbDeviceTypeToJsObj(env, usbDeviceTypes[i]);
469 NAPI_CALL(env, napi_set_element(env, jsList, i, item));
470 }
471 return jsList;
472 }
473
474 #ifdef USB_EDM_ENABLE
ParseUsbDeviceTypesArray(napi_env env,std::vector<USB::UsbDeviceType> & usbDeviceTypes,napi_value object)475 bool UsbManagerAddon::ParseUsbDeviceTypesArray(napi_env env, std::vector<USB::UsbDeviceType> &usbDeviceTypes,
476 napi_value object)
477 {
478 bool isArray = false;
479 napi_is_array(env, object, &isArray);
480 if (!isArray) {
481 return false;
482 }
483 uint32_t arrayLength = 0;
484 napi_get_array_length(env, object, &arrayLength);
485 if (arrayLength > EdmConstants::DISALLOWED_USB_DEVICES_TYPES_MAX_SIZE) {
486 EDMLOGE("ParseUsbDeviceTypesArray: arrayLength=[%{public}u] is too large", arrayLength);
487 return false;
488 }
489 for (uint32_t i = 0; i < arrayLength; i++) {
490 napi_value value = nullptr;
491 napi_get_element(env, object, i, &value);
492 napi_valuetype valueType = napi_undefined;
493 napi_typeof(env, value, &valueType);
494 if (valueType != napi_object) {
495 usbDeviceTypes.clear();
496 return false;
497 }
498 USB::UsbDeviceType usbDeviceType;
499 if (!GetUsbDeviceTypeFromNAPI(env, value, usbDeviceType)) {
500 usbDeviceTypes.clear();
501 return false;
502 }
503 usbDeviceTypes.push_back(usbDeviceType);
504 }
505 return true;
506 }
507
GetUsbDeviceTypeFromNAPI(napi_env env,napi_value value,USB::UsbDeviceType & usbDeviceType)508 bool UsbManagerAddon::GetUsbDeviceTypeFromNAPI(napi_env env, napi_value value, USB::UsbDeviceType &usbDeviceType)
509 {
510 int32_t baseClass = 0;
511 if (!JsObjectToInt(env, value, "baseClass", true, baseClass)) {
512 EDMLOGE("GetUsbDeviceTypeFromNAPI baseClass parse error!");
513 return false;
514 }
515 int32_t subClass = 0;
516 if (!JsObjectToInt(env, value, "subClass", true, subClass)) {
517 EDMLOGE("GetUsbDeviceTypeFromNAPI subClass parse error!");
518 return false;
519 }
520 int32_t protocol = 0;
521 if (!JsObjectToInt(env, value, "protocol", true, protocol)) {
522 EDMLOGE("GetUsbDeviceTypeFromNAPI protocol parse error!");
523 return false;
524 }
525 int32_t descriptor = -1;
526 if (!JsObjectToInt(env, value, "descriptor", true, descriptor)) {
527 EDMLOGE("GetUsbDeviceTypeFromNAPI descriptor parse error!");
528 return false;
529 }
530 if (!std::any_of(std::begin(DESCRIPTOR), std::end(DESCRIPTOR), [&](int item) { return item == descriptor; })) {
531 EDMLOGE("GetUsbDeviceTypeFromNAPI descriptor value error!");
532 return false;
533 }
534 usbDeviceType.baseClass = baseClass;
535 usbDeviceType.subClass = subClass;
536 usbDeviceType.protocol = protocol;
537 usbDeviceType.isDeviceType = descriptor;
538 EDMLOGD("GetUsbDeviceTypeFromNAPI baseClass: %{public}d, subClass: %{public}d, protocol: %{public}d, "
539 "isDeviceType: %{public}d", baseClass, subClass, protocol, descriptor);
540 return true;
541 }
542
UsbDeviceTypeToJsObj(napi_env env,const USB::UsbDeviceType & usbDeviceType)543 napi_value UsbManagerAddon::UsbDeviceTypeToJsObj(napi_env env, const USB::UsbDeviceType &usbDeviceType)
544 {
545 napi_value value = nullptr;
546 NAPI_CALL(env, napi_create_object(env, &value));
547
548 napi_value baseClass = nullptr;
549 NAPI_CALL(env, napi_create_int32(env, usbDeviceType.baseClass, &baseClass));
550 NAPI_CALL(env, napi_set_named_property(env, value, "baseClass", baseClass));
551
552 napi_value subClass = nullptr;
553 NAPI_CALL(env, napi_create_int32(env, usbDeviceType.subClass, &subClass));
554 NAPI_CALL(env, napi_set_named_property(env, value, "subClass", subClass));
555
556 napi_value protocol = nullptr;
557 NAPI_CALL(env, napi_create_int32(env, usbDeviceType.protocol, &protocol));
558 NAPI_CALL(env, napi_set_named_property(env, value, "protocol", protocol));
559
560 napi_value descriptor = nullptr;
561 NAPI_CALL(env, napi_create_int32(env, usbDeviceType.isDeviceType, &descriptor));
562 NAPI_CALL(env, napi_set_named_property(env, value, "descriptor", descriptor));
563 return value;
564 }
565 #endif
566
567 static napi_module g_usbManagerModule = {
568 .nm_version = 1,
569 .nm_flags = 0,
570 .nm_filename = nullptr,
571 .nm_register_func = UsbManagerAddon::Init,
572 .nm_modname = "enterprise.usbManager",
573 .nm_priv = ((void *)0),
574 .reserved = {0},
575 };
576
UsbManagerRegister()577 extern "C" __attribute__((constructor)) void UsbManagerRegister()
578 {
579 napi_module_register(&g_usbManagerModule);
580 }