1/* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include <iostream> 17#include <getopt.h> 18 19#include "virtual_keyboard_builder.h" 20#include "virtual_mouse_builder.h" 21#include "virtual_touchscreen_builder.h" 22 23using namespace ::OHOS::Msdp::DeviceStatus; 24 25static void ShowMountHelp() 26{ 27 std::cout << "Usage: vdevadm mount [-t <DEVICE TYPE>]" << std::endl; 28 std::cout << " -t <DEVICE TYPE>" << std::endl; 29 std::cout << " Specify virtual device type" << std::endl; 30 std::cout << " <DEVICE TYPE> can be:" << std::endl; 31 std::cout << " M For virtual mouse" << std::endl; 32 std::cout << " T For virtual touchscreen" << std::endl; 33 std::cout << " K For virtual keyboard" << std::endl; 34} 35 36static void ShowUnmountHelp() 37{ 38 std::cout << "Usage: vdevadm unmount [-t <DEVICE TYPE>]" << std::endl; 39 std::cout << " -t <DEVICE TYPE>" << std::endl; 40 std::cout << " Specify virtual device type" << std::endl; 41 std::cout << " <DEVICE TYPE> can be:" << std::endl; 42 std::cout << " M For virtual mouse" << std::endl; 43 std::cout << " T For virtual touchscreen" << std::endl; 44 std::cout << " K For virtual keyboard" << std::endl; 45} 46 47static void ShowCloneHelp() 48{ 49 std::cout << "Usage: vdevadm clone [-t <DEVICE TYPE>]" << std::endl; 50 std::cout << " -t <DEVICE TYPE>" << std::endl; 51 std::cout << " Specify virtual device type" << std::endl; 52 std::cout << " <DEVICE TYPE> can be:" << std::endl; 53 std::cout << " M For virtual mouse" << std::endl; 54 std::cout << " T For virtual touchscreen" << std::endl; 55 std::cout << " K For virtual keyboard" << std::endl; 56} 57 58static void ShowMonitorHelp() 59{ 60 std::cout << "Usage: vdevadm monitor [-t <DEVICE TYPE>]" << std::endl; 61 std::cout << " -t <DEVICE TYPE>" << std::endl; 62 std::cout << " Specify virtual device type" << std::endl; 63 std::cout << " <DEVICE TYPE> can be:" << std::endl; 64 std::cout << " M For virtual mouse" << std::endl; 65 std::cout << " T For virtual touchscreen" << std::endl; 66} 67 68static void ShowActHelp() 69{ 70 std::cout << "Usage: vdevadm act [-t <DEVICE TYPE>]" << std::endl; 71 std::cout << " -t <DEVICE TYPE>" << std::endl; 72 std::cout << " Specify virtual device type" << std::endl; 73 std::cout << " <DEVICE TYPE> can be:" << std::endl; 74 std::cout << " M For virtual mouse" << std::endl; 75 std::cout << " T For virtual touchscreen" << std::endl; 76 std::cout << " K For virtual keyboard" << std::endl; 77} 78 79static void ShowUsage() 80{ 81 std::cout << "Usage: vdevadm [-h] [--help] <command> [args]" << std::endl; 82 std::cout << std::endl; 83 std::cout << " Supported commands:" << std::endl; 84 std::cout << " mount Mount a virtual device" << std::endl; 85 std::cout << " unmount Unmount the virtual device" << std::endl; 86 std::cout << " clone Clone a virtual device" << std::endl; 87 std::cout << " monitor Monitor for current position of pointer" << std::endl; 88 std::cout << " act Act on the virtual device" << std::endl; 89 std::cout << std::endl; 90 std::cout << " Generally supported command args:" << std::endl; 91 std::cout << " -t <DEVICE TYPE>" << std::endl; 92 std::cout << " Specify virtual device type" << std::endl; 93 std::cout << " <DEVICE TYPE> can be:" << std::endl; 94 std::cout << " M For virtual mouse" << std::endl; 95 std::cout << " T For virtual touchscreen" << std::endl; 96 std::cout << " K For virtual keyboard" << std::endl; 97 std::cout << std::endl; 98 VirtualMouseBuilder::ShowUsage(); 99 std::cout << std::endl; 100 VirtualTouchScreenBuilder::ShowUsage(); 101 std::cout << std::endl; 102 VirtualKeyboardBuilder::ShowUsage(); 103 std::cout << std::endl; 104} 105 106static void Mount(int32_t argc, char *argv[]) 107{ 108 int32_t opt = getopt(argc, argv, "t:"); 109 if ((opt != 't') || (optarg == nullptr)) { 110 std::cout << "vdevadm mount: missing or required option arguments are not provided" << std::endl; 111 ShowMountHelp(); 112 return; 113 } 114 115 if (strcmp(optarg, "M") == 0) { 116 std::cout << "Mount virtual mouse" << std::endl; 117 VirtualMouseBuilder::Mount(); 118 } else if (strcmp(optarg, "T") == 0) { 119 std::cout << "Mount virtual touchscreen" << std::endl; 120 VirtualTouchScreenBuilder::Mount(); 121 } else if (strcmp(optarg, "K") == 0) { 122 std::cout << "Mount virtual keyboard" << std::endl; 123 VirtualKeyboardBuilder::Mount(); 124 } else { 125 std::cout << "vdevadm mount: invalid argument for option \'-t\'" << std::endl; 126 ShowMountHelp(); 127 } 128} 129 130static void Unmount(int32_t argc, char *argv[]) 131{ 132 int32_t opt = getopt(argc, argv, "t:"); 133 if ((opt != 't') || (optarg == nullptr)) { 134 std::cout << "vdevadm unmount: missing or required option arguments are not provided" << std::endl; 135 ShowUnmountHelp(); 136 return; 137 } 138 if (strcmp(optarg, "M") == 0) { 139 std::cout << "Unmount virtual mouse" << std::endl; 140 VirtualMouseBuilder::Unmount(); 141 } else if (strcmp(optarg, "T") == 0) { 142 std::cout << "Unmount virtual touchscreen" << std::endl; 143 VirtualTouchScreenBuilder::Unmount(); 144 } else if (strcmp(optarg, "K") == 0) { 145 std::cout << "Unmount virtual keyboard" << std::endl; 146 VirtualKeyboardBuilder::Unmount(); 147 } else { 148 std::cout << "vdevadm unmount: invalid argument for option \'-t\'" << std::endl; 149 ShowUnmountHelp(); 150 } 151} 152 153static void Clone(int32_t argc, char *argv[]) 154{ 155 int32_t opt = getopt(argc, argv, "t:"); 156 if ((opt != 't') || (optarg == nullptr)) { 157 std::cout << "vdevadm clone: missing or required option arguments are not provided" << std::endl; 158 ShowCloneHelp(); 159 return; 160 } 161 162 if (strcmp(optarg, "M") == 0) { 163 std::cout << "Clone virtual mouse" << std::endl; 164 VirtualMouseBuilder::Clone(); 165 } else if (strcmp(optarg, "T") == 0) { 166 std::cout << "Clone virtual touchscreen" << std::endl; 167 VirtualTouchScreenBuilder::Clone(); 168 } else if (strcmp(optarg, "K") == 0) { 169 std::cout << "Clone virtual keyboard" << std::endl; 170 VirtualKeyboardBuilder::Clone(); 171 } else { 172 std::cout << "vdevadm clone: invalid argument for option \'-t\'" << std::endl; 173 ShowCloneHelp(); 174 } 175} 176 177static void Monitor(int32_t argc, char *argv[]) 178{ 179 int32_t opt = getopt(argc, argv, "t:"); 180 if ((opt != 't') || (optarg == nullptr)) { 181 std::cout << "vdevadm monitor: required option is missing" << std::endl; 182 ShowMonitorHelp(); 183 return; 184 } 185 186 if (strcmp(optarg, "M") == 0) { 187 std::cout << "Monitor for position of current pointer" << std::endl; 188 VirtualMouseBuilder::Monitor(); 189 } else if (strcmp(optarg, "T") == 0) { 190 std::cout << "Monitor for current touch position" << std::endl; 191 VirtualTouchScreenBuilder::Monitor(); 192 } else { 193 std::cout << "vdevadm clone: invalid argument for option \'-t\'" << std::endl; 194 ShowMonitorHelp(); 195 } 196} 197 198static void Act(int32_t argc, char *argv[]) 199{ 200 int32_t opt = getopt(argc, argv, "t:"); 201 if ((opt != 't') || (optarg == nullptr)) { 202 std::cout << "vdevadm act: missing or required option arguments are not provided" << std::endl; 203 ShowActHelp(); 204 return; 205 } 206 207 if (strcmp(optarg, "M") == 0) { 208 std::cout << "Operate virtual mouse" << std::endl; 209 VirtualMouseBuilder::Act(argc, argv); 210 } else if (strcmp(optarg, "T") == 0) { 211 std::cout << "Operate virtual touchscreen" << std::endl; 212 VirtualTouchScreenBuilder::Act(argc, argv); 213 } else if (strcmp(optarg, "K") == 0) { 214 std::cout << "Operate virtual keyboard" << std::endl; 215 VirtualKeyboardBuilder::Act(argc, argv); 216 } else { 217 std::cout << "vdevadm act: invalid argument for option \'-t\'" << std::endl; 218 ShowActHelp(); 219 } 220} 221 222int32_t main(int32_t argc, char *argv[]) 223{ 224 static const struct option options[] { { "help", no_argument, nullptr, 'h' }, {} }; 225 int32_t opt = getopt_long(argc, argv, "+h", options, nullptr); 226 if (opt >= 0) { 227 ShowUsage(); 228 return EXIT_SUCCESS; 229 } 230 const char *command = argv[optind++]; 231 if (command == nullptr) { 232 std::cout << "vdevadm: command required" << std::endl; 233 ShowUsage(); 234 return EXIT_FAILURE; 235 } 236 if (strcmp(command, "mount") == 0) { 237 Mount(argc, argv); 238 } else if (strcmp(command, "unmount") == 0) { 239 Unmount(argc, argv); 240 } else if (strcmp(command, "clone") == 0) { 241 Clone(argc, argv); 242 } else if (strcmp(command, "monitor") == 0) { 243 Monitor(argc, argv); 244 } else if (strcmp(command, "act") == 0) { 245 Act(argc, argv); 246 } else { 247 std::cout << "vdevadm: invalid command \'" << command << "\'" << std::endl; 248 ShowUsage(); 249 } 250 return EXIT_SUCCESS; 251}