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