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 }