1 /*
2 * Copyright (c) 2021-2022 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 "virtual_device.h"
17
18 #include <sys/stat.h>
19
20 #include "virtual_finger.h"
21 #include "virtual_gamepad.h"
22 #include "virtual_joystick.h"
23 #include "virtual_keyboard.h"
24 #include "virtual_keyboard_sys_ctrl.h"
25 #include "virtual_keyboard_consumer_ctrl.h"
26 #include "virtual_keyboard_ext.h"
27 #include "virtual_knob.h"
28 #include "virtual_knob_sys_ctrl.h"
29 #include "virtual_knob_consumer_ctrl.h"
30 #include "virtual_knob_mouse.h"
31 #include "virtual_mouse.h"
32 #include "virtual_pen.h"
33 #include "virtual_pen_mouse.h"
34 #include "virtual_pen_keyboard.h"
35 #include "virtual_remote_control.h"
36 #include "virtual_single_finger.h"
37 #include "virtual_single_touchscreen.h"
38 #include "virtual_stylus.h"
39 #include "virtual_trackball.h"
40 #include "virtual_trackpad.h"
41 #include "virtual_trackpad_sys_ctrl.h"
42 #include "virtual_touchpad.h"
43 #include "virtual_touchscreen.h"
44 #include "virtual_trackpad_mouse.h"
45
46 namespace OHOS {
47 namespace MMI {
48 namespace {
49 constexpr int32_t FILE_SIZE_MAX = 0x5000;
50 constexpr int32_t INVALID_FILE_SIZE = -1;
51 constexpr int32_t FILE_POWER = 0777;
52 const std::string PROC_PATH = "/proc";
53 const std::string VIRTUAL_DEVICE_NAME = "vuinput";
54 const std::string g_pid = std::to_string(getpid());
55
IsNum(const std::string & str)56 inline bool IsNum(const std::string& str)
57 {
58 std::istringstream sin(str);
59 double num;
60 return (sin >> num) && sin.eof();
61 }
62
IsValidPath(const std::string & rootDir,const std::string & filePath)63 inline bool IsValidPath(const std::string& rootDir, const std::string& filePath)
64 {
65 return (filePath.compare(0, rootDir.size(), rootDir) == 0);
66 }
67
IsValidUinputPath(const std::string & filePath)68 inline bool IsValidUinputPath(const std::string& filePath)
69 {
70 return IsValidPath(PROC_PATH, filePath);
71 }
72
IsFileExists(const std::string & fileName)73 inline bool IsFileExists(const std::string& fileName)
74 {
75 return (access(fileName.c_str(), F_OK) == 0);
76 }
77
CheckFileName(const std::string & fileName)78 bool CheckFileName(const std::string& fileName)
79 {
80 std::string::size_type pos = fileName.find("_");
81 if (pos == std::string::npos) {
82 std::cout << "Failed to create file" << std::endl;
83 return false;
84 }
85 if (!IsNum(fileName.substr(0, pos))) {
86 std::cout << "File name check error" << std::endl;
87 return false;
88 }
89 std::vector<std::string> validFileNames = {
90 "mouse", "keyboard", "joystick", "trackball", "remotecontrol",
91 "trackpad", "knob", "gamepad", "touchpad", "touchscreen",
92 "pen", "all"
93 };
94 std::string deviceName = fileName.substr(pos + 1);
95 bool result = std::any_of(validFileNames.begin(), validFileNames.end(), [deviceName](const std::string& str) {
96 return str == deviceName;
97 });
98 if (!result) {
99 std::cout << "Check device file name:" << fileName << std::endl;
100 }
101 return result;
102 }
103
RemoveDir(const std::string & filePath)104 void RemoveDir(const std::string& filePath)
105 {
106 if (filePath.empty()) {
107 std::cout << "File path is empty" << std::endl;
108 return;
109 }
110 DIR* dir = opendir(filePath.c_str());
111 if (dir == nullptr) {
112 std::cout << "Failed to open folder:" << filePath << std::endl;
113 return;
114 }
115 dirent* ptr = nullptr;
116 while ((ptr = readdir(dir)) != nullptr) {
117 std::string tmpDirName(ptr->d_name);
118 if ((tmpDirName == ".") || (tmpDirName == "..")) {
119 continue;
120 }
121 if (ptr->d_type == DT_REG) {
122 std::string rmFile = filePath + ptr->d_name;
123 if (std::remove(rmFile.c_str()) != 0) {
124 std::cout << "Remove file:" << rmFile << "failed" << std::endl;
125 }
126 } else if (ptr->d_type == DT_DIR) {
127 RemoveDir((filePath + ptr->d_name + "/"));
128 } else {
129 std::cout << "File name:" << ptr << "type is error" << std::endl;
130 }
131 }
132 if (closedir(dir) != 0) {
133 std::cout << "Close dir:" << filePath << "failed" << std::endl;
134 }
135 if (std::remove(filePath.c_str()) != 0) {
136 std::cout << "Remove dir:" << filePath <<"failed" << std::endl;
137 }
138 return;
139 }
140
StartMouse()141 void StartMouse()
142 {
143 static VirtualMouse virtualMouse;
144 virtualMouse.SetUp();
145 }
146
StartKeyboard()147 void StartKeyboard()
148 {
149 static VirtualKeyboard virtualKey;
150 virtualKey.SetUp();
151 static VirtualKeyboardSysCtrl virtualKeyboardSysCtrl;
152 virtualKeyboardSysCtrl.SetUp();
153 static VirtualKeyboardConsumerCtrl virtualKeyboardConsumerCtrl;
154 virtualKeyboardConsumerCtrl.SetUp();
155 static VirtualKeyboardExt virtualKeyext;
156 virtualKeyext.SetUp();
157 }
158
StartJoystick()159 void StartJoystick()
160 {
161 static VirtualJoystick virtualJoystick;
162 virtualJoystick.SetUp();
163 }
164
StartTrackball()165 void StartTrackball()
166 {
167 static VirtualTrackball virtualTrackball;
168 virtualTrackball.SetUp();
169 }
170
StartRemoteControl()171 void StartRemoteControl()
172 {
173 static VirtualRemoteControl virtualRemoteControl;
174 virtualRemoteControl.SetUp();
175 }
176
StartTrackpad()177 void StartTrackpad()
178 {
179 static VirtualTrackpad virtualTrackpad;
180 virtualTrackpad.SetUp();
181 static VirtualTrackpadMouse virtualMousepadMouse;
182 virtualMousepadMouse.SetUp();
183 static VirtualTrackpadSysCtrl virtualTrackpadSysCtrl;
184 virtualTrackpadSysCtrl.SetUp();
185 }
186
StartKnob()187 void StartKnob()
188 {
189 static VirtualKnob virtualKnob;
190 virtualKnob.SetUp();
191 static VirtualKnobConsumerCtrl virtualKnobConsumerCtrl;
192 virtualKnobConsumerCtrl.SetUp();
193 static VirtualKnobMouse virtualKnobMouse;
194 virtualKnobMouse.SetUp();
195 static VirtualKnobSysCtrl virtualKnobSysCtrl;
196 virtualKnobSysCtrl.SetUp();
197 }
198
StartGamePad()199 void StartGamePad()
200 {
201 static VirtualGamePad virtualGamePad;
202 virtualGamePad.SetUp();
203 }
204
StartTouchPad()205 void StartTouchPad()
206 {
207 static VirtualStylus virtualStylus;
208 virtualStylus.SetUp();
209 static VirtualTouchpad virtualTouchpad;
210 virtualTouchpad.SetUp();
211 static VirtualFinger virtualFinger;
212 virtualFinger.SetUp();
213 static VirtualSingleFinger virtualSingleFinger;
214 virtualSingleFinger.SetUp();
215 }
216
StartTouchScreen()217 void StartTouchScreen()
218 {
219 static VirtualTouchScreen virtualTouchScreen;
220 virtualTouchScreen.SetUp();
221 static VirtualSingleTouchScreen virtualSingleTouchScreen;
222 virtualSingleTouchScreen.SetUp();
223 }
224
StartPen()225 void StartPen()
226 {
227 static VirtualPen virtualPen;
228 virtualPen.SetUp();
229 static VirtualPenMouse virtualPenMouse;
230 virtualPenMouse.SetUp();
231 static VirtualPenKeyboard virtualPenKeyboard;
232 virtualPenKeyboard.SetUp();
233 }
234
235 using virtualFun = void (*)();
236 std::map<std::string, virtualFun> mapFun = {
237 {"mouse", &StartMouse},
238 {"keyboard", &StartKeyboard},
239 {"joystick", &StartJoystick},
240 {"trackball", &StartTrackball},
241 {"remotecontrol", &StartRemoteControl},
242 {"trackpad", &StartTrackpad},
243 {"knob", &StartKnob},
244 {"gamepad", &StartGamePad},
245 {"touchpad", &StartTouchPad},
246 {"touchscreen", &StartTouchScreen},
247 {"pen", &StartPen}
248 };
249
StartAllDevices()250 void StartAllDevices()
251 {
252 if (mapFun.empty()) {
253 std::cout << "mapFun is empty" << std::endl;
254 return;
255 }
256 for (const auto &item : mapFun) {
257 (*item.second)();
258 }
259 }
260 } // namespace
261
VirtualDevice(const std::string & deviceName,uint16_t busType,uint16_t vendorId,uint16_t productId)262 VirtualDevice::VirtualDevice(const std::string& deviceName, uint16_t busType,
263 uint16_t vendorId, uint16_t productId)
264 : deviceName_(deviceName),
265 busTtype_(busType),
266 vendorId_(vendorId),
267 productId_(productId),
268 version_(1) {}
269
~VirtualDevice()270 VirtualDevice::~VirtualDevice()
271 {
272 Close();
273 }
274
BrowseDirectory(const std::string & filePath)275 std::vector<std::string> VirtualDevice::BrowseDirectory(const std::string& filePath)
276 {
277 std::vector<std::string> fileList;
278 fileList.clear();
279 DIR* dir = opendir(filePath.c_str());
280 if (dir == nullptr) {
281 std::cout << "Failed to open folder" << std::endl;
282 return fileList;
283 }
284 dirent* ptr = nullptr;
285 while ((ptr = readdir(dir)) != nullptr) {
286 if (ptr->d_type == DT_REG) {
287 if (ClearFileResidues(ptr->d_name)) {
288 fileList.push_back(ptr->d_name);
289 }
290 }
291 }
292 if (closedir(dir) != 0) {
293 std::cout << "Close dir:" << filePath << "failed" << std::endl;
294 }
295 return fileList;
296 }
297
ClearFileResidues(const std::string & fileName)298 bool VirtualDevice::ClearFileResidues(const std::string& fileName)
299 {
300 DIR *dir = nullptr;
301 const std::string::size_type pos = fileName.find("_");
302 const std::string procressPath = "/proc/" + fileName.substr(0, pos) + "/";
303 const std::string filePath = procressPath + "cmdline";
304 std::string temp;
305 std::string processName;
306 if (!CheckFileName(fileName)) {
307 std::cout << "File name check error" << std::endl;
308 goto RELEASE_RES;
309 }
310 if (pos == std::string::npos) {
311 std::cout << "Failed to create file" << std::endl;
312 goto RELEASE_RES;
313 }
314 dir = opendir(procressPath.c_str());
315 if (dir == nullptr) {
316 std::cout << "Useless flag file:" << procressPath << std::endl;
317 goto RELEASE_RES;
318 }
319 temp = ReadUinputToolFile(filePath);
320 if (temp.empty()) {
321 std::cout << "Temp is empty" << std::endl;
322 goto RELEASE_RES;
323 }
324 processName.append(temp);
325 if (processName.find(VIRTUAL_DEVICE_NAME.c_str()) != std::string::npos) {
326 if (closedir(dir) != 0) {
327 std::cout << "Close dir:" << procressPath <<"failed" << std::endl;
328 }
329 return true;
330 }
331 RELEASE_RES:
332 if (dir != nullptr) {
333 if (closedir(dir) != 0) {
334 std::cout << "Close dir failed" << std::endl;
335 }
336 }
337 if (std::remove((g_folderPath + fileName).c_str()) != 0) {
338 std::cout << "Remove file failed" << std::endl;
339 }
340 return false;
341 }
342
CreateKey()343 bool VirtualDevice::CreateKey()
344 {
345 auto fun = [&](int32_t uiSet, const std::vector<uint32_t>& list) ->bool {
346 for (const auto &item : list) {
347 if (ioctl(fd_, uiSet, item) < 0) {
348 std::cout << __func__ << " not setting event type:" << item
349 << ", deviceName:" << deviceName_ << std::endl;
350 return false;
351 }
352 }
353 return true;
354 };
355 std::map<int32_t, std::vector<uint32_t>> uinputTypes;
356 uinputTypes[UI_SET_EVBIT] = GetEventTypes();
357 uinputTypes[UI_SET_KEYBIT] = GetKeys();
358 uinputTypes[UI_SET_PROPBIT] = GetProperties();
359 uinputTypes[UI_SET_ABSBIT] = GetAbs();
360 uinputTypes[UI_SET_RELBIT] = GetRelBits();
361 uinputTypes[UI_SET_MSCBIT] = GetMiscellaneous();
362 uinputTypes[UI_SET_LEDBIT] = GetLeds();
363 uinputTypes[UI_SET_SWBIT] = GetSwitches();
364 uinputTypes[UI_SET_FFBIT] = GetRepeats();
365
366 for (const auto &item : uinputTypes) {
367 if (!fun(item.first, item.second)) {
368 return false;
369 }
370 }
371 return true;
372 }
373
SetAbsResolution()374 bool VirtualDevice::SetAbsResolution()
375 {
376 for (const auto &item : absInit_) {
377 ioctl(fd_, UI_ABS_SETUP, &item);
378 }
379 return true;
380 }
381
SetPhys(const std::string & deviceName)382 bool VirtualDevice::SetPhys(const std::string& deviceName)
383 {
384 std::string phys;
385 std::map<std::string, std::string> typeDevice = {
386 {"Virtual Mouse", "mouse"},
387 {"Virtual keyboard", "keyboard"},
388 {"Virtual KeyboardConsumerCtrl", "keyboard"},
389 {"Virtual keyboardExt", "keyboard"},
390 {"Virtual KeyboardSysCtrl", "keyboard"},
391 {"Virtual Knob", "knob"},
392 {"Virtual KnobConsumerCtrl", "knob"},
393 {"Virtual KnobMouse", "knob"},
394 {"Virtual KnobSysCtrl", "knob"},
395 {"Virtual Trackpad", "trackpad"},
396 {"Virtual TrackPadMouse", "trackpad"},
397 {"Virtual TrackpadSysCtrl", "trackpad"},
398 {"Virtual Finger", "touchpad"},
399 {"Virtual SingleFinger", "touchpad"},
400 {"Virtual Stylus", "touchpad"},
401 {"Virtual Touchpad", "touchpad"},
402 {"Virtual RemoteControl", "remotecontrol"},
403 {"Virtual Joystick", "joystick"},
404 {"Virtual GamePad", "gamepad"},
405 {"Virtual Trackball", "trackball"},
406 {"Virtual TouchScreen", "touchscreen"},
407 {"Virtual SingleTouchScreen", "touchscreen"},
408 {"V-Pencil", "pen"},
409 {"V-Pencil-mouse", "pen"},
410 {"V-Pencil-keyboard", "pen"},
411 };
412 std::string deviceType = typeDevice.find(deviceName)->second;
413 phys.append(deviceType).append(g_pid).append("/").append(g_pid);
414
415 if (ioctl(fd_, UI_SET_PHYS, phys.c_str()) < 0) {
416 std::cout << "Failed to set uinput phys" << std::endl;
417 return false;
418 }
419 return true;
420 }
421
DoIoctl(int32_t fd,int32_t request,const uint32_t value)422 bool VirtualDevice::DoIoctl(int32_t fd, int32_t request, const uint32_t value)
423 {
424 int32_t rc = ioctl(fd, request, value);
425 if (rc < 0) {
426 std::cout << "Failed to ioctl" << std::endl;
427 return false;
428 }
429 return true;
430 }
431
SetDeviceId()432 void VirtualDevice::SetDeviceId()
433 {
434 uinputDev_.id.bustype = busTtype_;
435 uinputDev_.id.vendor = vendorId_;
436 uinputDev_.id.product = productId_;
437 uinputDev_.id.version = version_;
438 }
439
SetUp()440 bool VirtualDevice::SetUp()
441 {
442 fd_ = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
443 if (fd_ < 0) {
444 std::cout << "Failed to open uinput: " << fd_ << std::endl;
445 return false;
446 }
447
448 if (strncpy_s(uinputDev_.name, sizeof(uinputDev_.name), deviceName_.c_str(), deviceName_.size()) != 0) {
449 std::cout << "Failed to copied device name: " << uinputDev_.name << std::endl;
450 return false;
451 };
452 SetDeviceId();
453 if (!SetAbsResolution()) {
454 std::cout << "Failed to set uinput abs resolution" << std::endl;
455 return false;
456 }
457 if (!SetPhys(deviceName_)) {
458 std::cout << "Failed to set uinput phys" << std::endl;
459 return false;
460 }
461 if (!CreateKey()) {
462 std::cout << "Failed to create uinput KeyValue" << std::endl;
463 return false;
464 }
465 if (write(fd_, &uinputDev_, sizeof(uinputDev_)) < 0) {
466 std::cout << "Unable to write device info to target" << std::endl;
467 return false;
468 }
469 if (ioctl(fd_, UI_DEV_CREATE) < 0) {
470 std::cout << "Try to create uinput device filed in fd: " << fd_ << std::endl;
471 return false;
472 }
473 return true;
474 }
475
Close()476 void VirtualDevice::Close()
477 {
478 if (fd_ >= 0) {
479 ioctl(fd_, UI_DEV_DESTROY);
480 close(fd_);
481 fd_ = -1;
482 }
483 }
484
ReadFile(const std::string & filePath)485 std::string VirtualDevice::ReadFile(const std::string& filePath)
486 {
487 FILE* fp = fopen(filePath.c_str(), "r");
488 if (fp == nullptr) {
489 std::cout << "Failed to open file: " << filePath << std::endl;
490 return "";
491 }
492 std::string dataStr;
493 char buf[256] = {};
494 while (fgets(buf, sizeof(buf), fp) != nullptr) {
495 dataStr += buf;
496 }
497 if (fclose(fp) != 0) {
498 std::cout << "Failed to close file" << std::endl;
499 }
500 return dataStr;
501 }
502
GetFileSize(const std::string & filePath)503 int32_t VirtualDevice::GetFileSize(const std::string& filePath)
504 {
505 struct stat statbuf = {0};
506 if (stat(filePath.c_str(), &statbuf) != 0) {
507 std::cout << "Get file size error" << std::endl;
508 return INVALID_FILE_SIZE;
509 }
510 return statbuf.st_size;
511 }
512
ReadUinputToolFile(const std::string & filePath)513 std::string VirtualDevice::ReadUinputToolFile(const std::string& filePath)
514 {
515 if (filePath.empty()) {
516 std::cout << "FilePath is empty" << std::endl;
517 return "";
518 }
519 char realPath[PATH_MAX] = {};
520 if (realpath(filePath.c_str(), realPath) == nullptr) {
521 std::cout << "Path is error" << std::endl;
522 return "";
523 }
524 if (!IsValidUinputPath(realPath)) {
525 std::cout << "File path is error" << std::endl;
526 return "";
527 }
528 if (!IsFileExists(realPath)) {
529 std::cout << "File not exist" << std::endl;
530 return "";
531 }
532 int32_t fileSize = GetFileSize(realPath);
533 if ((fileSize < 0) || (fileSize > FILE_SIZE_MAX)) {
534 std::cout << "File size out of read range" << std::endl;
535 return "";
536 }
537 return ReadFile(filePath);
538 }
539
CreateHandle(const std::string & deviceArgv)540 bool VirtualDevice::CreateHandle(const std::string& deviceArgv)
541 {
542 if (deviceArgv == "all") {
543 StartAllDevices();
544 return true;
545 }
546 if (mapFun.find(deviceArgv) == mapFun.end()) {
547 std::cout << "Please enter the device type correctly" << std::endl;
548 return false;
549 }
550 (*mapFun[deviceArgv])();
551 return true;
552 }
553
AddDevice(const std::string & startDeviceName)554 bool VirtualDevice::AddDevice(const std::string& startDeviceName)
555 {
556 if (startDeviceName.empty()) {
557 std::cout << "StartDeviceName is empty" << std::endl;
558 return false;
559 }
560 if (!CreateHandle(startDeviceName)) {
561 std::cout << "Failed to start device: " << startDeviceName <<std::endl;
562 return false;
563 }
564 if (!IsFileExists(g_folderPath)) {
565 mkdir(g_folderPath.c_str(), FILE_POWER);
566 }
567 std::string symbolFile;
568 symbolFile.append(g_folderPath).append(g_pid).append("_").append(startDeviceName);
569 std::ofstream flagFile;
570 flagFile.open(symbolFile.c_str());
571 if (!flagFile.is_open()) {
572 std::cout << "Failed to create file" <<std::endl;
573 return false;
574 }
575 return true;
576 }
577
CloseDevice(const std::string & closeDeviceName,const std::vector<std::string> & deviceList)578 bool VirtualDevice::CloseDevice(const std::string& closeDeviceName, const std::vector<std::string>& deviceList)
579 {
580 if (BrowseDirectory(g_folderPath).size() == 0) {
581 std::cout << "No device to off" <<std::endl;
582 return false;
583 }
584 if (deviceList.empty()) {
585 RemoveDir(g_folderPath);
586 std::cout << "No start device" <<std::endl;
587 return false;
588 }
589 if (closeDeviceName == "all") {
590 for (const auto &it : deviceList) {
591 kill(atoi(it.c_str()), SIGKILL);
592 }
593 RemoveDir(g_folderPath);
594 return true;
595 }
596 for (const auto &it : deviceList) {
597 if (it.find(closeDeviceName) == 0) {
598 kill(atoi(it.c_str()), SIGKILL);
599 if (BrowseDirectory(g_folderPath).size() == 0) {
600 RemoveDir(g_folderPath);
601 }
602 return true;
603 }
604 }
605 std::cout << "Device shutdown failed! The PID format is incorrect" <<std::endl;
606 return false;
607 }
608
CommandBranch(std::vector<std::string> & argvList)609 bool VirtualDevice::CommandBranch(std::vector<std::string>& argvList)
610 {
611 std::vector<std::string> deviceList = BrowseDirectory(g_folderPath);
612 if (argvList[1] == "start") {
613 if (argvList.size() != PARAMETERS_NUMBER) {
614 std::cout << "Invalid Input Para, Please Check the validity of the para" << std::endl;
615 return false;
616 }
617 if (!AddDevice(argvList.back())) {
618 std::cout << "Failed to create device" << std::endl;
619 return false;
620 }
621 return true;
622 } else if (argvList[1] == "list") {
623 if (argvList.size() != PARAMETERS_QUERY_NUMBER) {
624 std::cout << "Invalid Input Para, Please Check the validity of the para" << std::endl;
625 return false;
626 }
627 std::string::size_type pos;
628 std::cout << "PID\tDEVICE" << std::endl;
629 for (const auto &item : deviceList) {
630 pos = item.find("_");
631 std::cout << item.substr(0, pos) << "\t" << item.substr(pos + 1, item.size() - pos - 1) << std::endl;
632 }
633 return false;
634 } else if (argvList[1] == "close") {
635 if (argvList.size() != PARAMETERS_NUMBER) {
636 std::cout << "Invalid Input Para, Please Check the validity of the para" << std::endl;
637 return false;
638 }
639 if (!CloseDevice(argvList.back(), deviceList)) {
640 return false;
641 } else {
642 std::cout << "device closed successfully" << std::endl;
643 return false;
644 }
645 } else {
646 std::cout << "The command line format is incorrect" << std::endl;
647 return false;
648 }
649 }
650
SetResolution(const ResolutionInfo & resolutionInfo)651 void VirtualDevice::SetResolution(const ResolutionInfo& resolutionInfo)
652 {
653 uinputAbs_.code = resolutionInfo.axisCode;
654 uinputAbs_.absinfo.resolution = resolutionInfo.absResolution;
655 absInit_.push_back(uinputAbs_);
656 }
657
SetAbsValue(const AbsInfo & absInfo)658 void VirtualDevice::SetAbsValue(const AbsInfo& absInfo)
659 {
660 uinputDev_.absmin[absInfo.code] = absInfo.minValue;
661 uinputDev_.absmax[absInfo.code] = absInfo.maxValue;
662 uinputDev_.absfuzz[absInfo.code] = absInfo.fuzz;
663 uinputDev_.absflat[absInfo.code] = absInfo.flat;
664 }
665
GetEventTypes() const666 const std::vector<uint32_t>& VirtualDevice::GetEventTypes() const
667 {
668 return eventTypes_;
669 }
670
GetKeys() const671 const std::vector<uint32_t>& VirtualDevice::GetKeys() const
672 {
673 return keys_;
674 }
675
GetProperties() const676 const std::vector<uint32_t>& VirtualDevice::GetProperties() const
677 {
678 return properties_;
679 }
680
GetAbs() const681 const std::vector<uint32_t>& VirtualDevice::GetAbs() const
682 {
683 return abs_;
684 }
685
GetRelBits() const686 const std::vector<uint32_t>& VirtualDevice::GetRelBits() const
687 {
688 return relBits_;
689 }
690
GetLeds() const691 const std::vector<uint32_t>& VirtualDevice::GetLeds() const
692 {
693 return leds_;
694 }
695
GetRepeats() const696 const std::vector<uint32_t>& VirtualDevice::GetRepeats() const
697 {
698 return repeats_;
699 }
700
GetMiscellaneous() const701 const std::vector<uint32_t>& VirtualDevice::GetMiscellaneous() const
702 {
703 return miscellaneous_;
704 }
705
GetSwitches() const706 const std::vector<uint32_t>& VirtualDevice::GetSwitches() const
707 {
708 return switches_;
709 }
710 } // namespace MMI
711 } // namespace OHOS
712