/* * @Author: DI JUNKUN * @Date: 2023-12-14 * Copyright (c) 2023 by DI JUNKUN, All Rights Reserved. */ #ifndef _DEVICE_CONTROLLER_H_ #define _DEVICE_CONTROLLER_H_ #include #include #include #include "display_info.h" using json = nlohmann::json; namespace crossdesk { typedef enum { mouse = 0, keyboard, audio_capture, host_infomation, display_id, } ControlType; typedef enum { move = 0, left_down, left_up, right_down, right_up, middle_down, middle_up, wheel_vertical, wheel_horizontal } MouseFlag; typedef enum { key_down = 0, key_up } KeyFlag; typedef struct { float x; float y; int s; MouseFlag flag; } Mouse; typedef struct { size_t key_value; KeyFlag flag; } Key; typedef struct { char host_name[64]; size_t host_name_size; char** display_list; size_t display_num; int* left; int* top; int* right; int* bottom; } HostInfo; struct RemoteAction { ControlType type; union { Mouse m; Key k; HostInfo i; bool a; int d; }; // parse std::string to_json() const { return ToJson(*this); } bool from_json(const std::string& json_str) { RemoteAction temp; if (!FromJson(json_str, temp)) return false; *this = temp; return true; } static std::string ToJson(const RemoteAction& a) { json j; j["type"] = a.type; switch (a.type) { case ControlType::mouse: j["mouse"] = { {"x", a.m.x}, {"y", a.m.y}, {"s", a.m.s}, {"flag", a.m.flag}}; break; case ControlType::keyboard: j["keyboard"] = {{"key_value", a.k.key_value}, {"flag", a.k.flag}}; break; case ControlType::audio_capture: j["audio_capture"] = a.a; break; case ControlType::display_id: j["display_id"] = a.d; break; case ControlType::host_infomation: { json displays = json::array(); for (size_t idx = 0; idx < a.i.display_num; idx++) { displays.push_back( {{"name", a.i.display_list ? a.i.display_list[idx] : ""}, {"left", a.i.left ? a.i.left[idx] : 0}, {"top", a.i.top ? a.i.top[idx] : 0}, {"right", a.i.right ? a.i.right[idx] : 0}, {"bottom", a.i.bottom ? a.i.bottom[idx] : 0}}); } j["host_info"] = {{"host_name", a.i.host_name}, {"display_num", a.i.display_num}, {"displays", displays}}; break; } } return j.dump(); } static bool FromJson(const std::string& json_str, RemoteAction& out) { try { json j = json::parse(json_str); out.type = (ControlType)j.at("type").get(); switch (out.type) { case ControlType::mouse: out.m.x = j.at("mouse").at("x").get(); out.m.y = j.at("mouse").at("y").get(); out.m.s = j.at("mouse").at("s").get(); out.m.flag = (MouseFlag)j.at("mouse").at("flag").get(); break; case ControlType::keyboard: out.k.key_value = j.at("keyboard").at("key_value").get(); out.k.flag = (KeyFlag)j.at("keyboard").at("flag").get(); break; case ControlType::audio_capture: out.a = j.at("audio_capture").get(); break; case ControlType::display_id: out.d = j.at("display_id").get(); break; case ControlType::host_infomation: { std::string host_name = j.at("host_info").at("host_name").get(); strncpy(out.i.host_name, host_name.c_str(), sizeof(out.i.host_name)); out.i.host_name[sizeof(out.i.host_name) - 1] = '\0'; out.i.host_name_size = host_name.size(); out.i.display_num = j.at("host_info").at("display_num").get(); auto displays = j.at("host_info").at("displays"); out.i.display_list = (char**)malloc(out.i.display_num * sizeof(char*)); out.i.left = (int*)malloc(out.i.display_num * sizeof(int)); out.i.top = (int*)malloc(out.i.display_num * sizeof(int)); out.i.right = (int*)malloc(out.i.display_num * sizeof(int)); out.i.bottom = (int*)malloc(out.i.display_num * sizeof(int)); for (size_t idx = 0; idx < out.i.display_num; idx++) { std::string name = displays[idx].at("name").get(); out.i.display_list[idx] = (char*)malloc(name.size() + 1); strcpy(out.i.display_list[idx], name.c_str()); out.i.left[idx] = displays[idx].at("left").get(); out.i.top[idx] = displays[idx].at("top").get(); out.i.right[idx] = displays[idx].at("right").get(); out.i.bottom[idx] = displays[idx].at("bottom").get(); } break; } } return true; } catch (const std::exception& e) { printf("Failed to parse RemoteAction JSON: %s\n", e.what()); return false; } } }; // int key_code, bool is_down typedef void (*OnKeyAction)(int, bool, void*); class DeviceController { public: virtual ~DeviceController() {} public: // virtual int Init(int screen_width, int screen_height); // virtual int Destroy(); // virtual int SendMouseCommand(RemoteAction remote_action); // virtual int Hook(); // virtual int Unhook(); }; } // namespace crossdesk #endif