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
23 using namespace ::OHOS::Msdp::DeviceStatus;
24
ShowMountHelp()25 static 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
ShowUnmountHelp()36 static 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
ShowCloneHelp()47 static 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
ShowMonitorHelp()58 static 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
ShowActHelp()68 static 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
ShowUsage()79 static 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
Mount(int32_t argc,char * argv[])106 static 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
Unmount(int32_t argc,char * argv[])130 static 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
Clone(int32_t argc,char * argv[])153 static 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
Monitor(int32_t argc,char * argv[])177 static 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
Act(int32_t argc,char * argv[])198 static 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
main(int32_t argc,char * argv[])222 int32_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 }