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}