1*21b177e0SEddie James #pragma once 2*21b177e0SEddie James 3*21b177e0SEddie James #include <rfb/rfb.h> 4*21b177e0SEddie James 5*21b177e0SEddie James #include <map> 6*21b177e0SEddie James #include <string> 7*21b177e0SEddie James 8*21b177e0SEddie James namespace ikvm 9*21b177e0SEddie James { 10*21b177e0SEddie James 11*21b177e0SEddie James /* 12*21b177e0SEddie James * @class Input 13*21b177e0SEddie James * @brief Receives events from RFB clients and sends reports to the USB input 14*21b177e0SEddie James * device 15*21b177e0SEddie James */ 16*21b177e0SEddie James class Input 17*21b177e0SEddie James { 18*21b177e0SEddie James public: 19*21b177e0SEddie James /* 20*21b177e0SEddie James * @brief Constructs Input object 21*21b177e0SEddie James * 22*21b177e0SEddie James * @param[in] p - Path to the USB input device 23*21b177e0SEddie James */ 24*21b177e0SEddie James Input(const std::string& p); 25*21b177e0SEddie James ~Input(); 26*21b177e0SEddie James Input(const Input&) = default; 27*21b177e0SEddie James Input& operator=(const Input&) = default; 28*21b177e0SEddie James Input(Input&&) = default; 29*21b177e0SEddie James Input& operator=(Input&&) = default; 30*21b177e0SEddie James 31*21b177e0SEddie James /* 32*21b177e0SEddie James * @brief RFB client key event handler 33*21b177e0SEddie James * 34*21b177e0SEddie James * @param[in] down - Boolean indicating whether key is pressed or not 35*21b177e0SEddie James * @param[in] key - Key code 36*21b177e0SEddie James * @param[in] cl - Handle to the RFB client 37*21b177e0SEddie James */ 38*21b177e0SEddie James static void keyEvent(rfbBool down, rfbKeySym key, rfbClientPtr cl); 39*21b177e0SEddie James /* 40*21b177e0SEddie James * @brief RFB client pointer event handler 41*21b177e0SEddie James * 42*21b177e0SEddie James * @param[in] buttonMask - Bitmask indicating which buttons have been 43*21b177e0SEddie James * pressed 44*21b177e0SEddie James * @param[in] x - Pointer x-coordinate 45*21b177e0SEddie James * @param[in] y - Pointer y-coordinate 46*21b177e0SEddie James * @param[in] cl - Handle to the RFB client 47*21b177e0SEddie James */ 48*21b177e0SEddie James static void pointerEvent(int buttonMask, int x, int y, rfbClientPtr cl); 49*21b177e0SEddie James 50*21b177e0SEddie James /* 51*21b177e0SEddie James * @brief Sends a data packet to the USB input device 52*21b177e0SEddie James * 53*21b177e0SEddie James * @param[in] data - pointer to data 54*21b177e0SEddie James * @param[in] size - number of bytes to send 55*21b177e0SEddie James */ 56*21b177e0SEddie James void sendRaw(char* data, int size); 57*21b177e0SEddie James /* @brief Sends an HID report to the USB input device */ 58*21b177e0SEddie James void sendReport(); 59*21b177e0SEddie James 60*21b177e0SEddie James private: 61*21b177e0SEddie James enum 62*21b177e0SEddie James { 63*21b177e0SEddie James NUM_MODIFIER_BITS = 4, 64*21b177e0SEddie James POINTER_LENGTH = 6, 65*21b177e0SEddie James REPORT_LENGTH = 8 66*21b177e0SEddie James }; 67*21b177e0SEddie James 68*21b177e0SEddie James /* @brief Keyboard HID identifier byte */ 69*21b177e0SEddie James static const char keyboardID; 70*21b177e0SEddie James /* @brief Pointer HID identifier byte */ 71*21b177e0SEddie James static const char pointerID; 72*21b177e0SEddie James /* @brief HID modifier bits mapped to shift and control key codes */ 73*21b177e0SEddie James static const char shiftCtrlMap[NUM_MODIFIER_BITS]; 74*21b177e0SEddie James /* @brief HID modifier bits mapped to meta and alt key codes */ 75*21b177e0SEddie James static const char metaAltMap[NUM_MODIFIER_BITS]; 76*21b177e0SEddie James 77*21b177e0SEddie James /* 78*21b177e0SEddie James * @brief Translates a RFB-specific key code to HID modifier bit 79*21b177e0SEddie James * 80*21b177e0SEddie James * @param[in] key - key code 81*21b177e0SEddie James */ 82*21b177e0SEddie James static char keyToMod(rfbKeySym key); 83*21b177e0SEddie James /* 84*21b177e0SEddie James * @brief Translates a RFB-specific key code to HID scancode 85*21b177e0SEddie James * 86*21b177e0SEddie James * @param[in] key - key code 87*21b177e0SEddie James */ 88*21b177e0SEddie James static char keyToScancode(rfbKeySym key); 89*21b177e0SEddie James 90*21b177e0SEddie James /* @brief Indicates whether or not to send a keyboard report */ 91*21b177e0SEddie James bool sendKeyboard; 92*21b177e0SEddie James /* @brief Indicates whether or not to send a pointer report */ 93*21b177e0SEddie James bool sendPointer; 94*21b177e0SEddie James /* @brief File descriptor for the USB input device */ 95*21b177e0SEddie James int fd; 96*21b177e0SEddie James /* @brief Data for keyboard report */ 97*21b177e0SEddie James char keyboardReport[REPORT_LENGTH]; 98*21b177e0SEddie James /* @brief Data for pointer report */ 99*21b177e0SEddie James char pointerReport[REPORT_LENGTH]; 100*21b177e0SEddie James /* @brief Path to the USB input device */ 101*21b177e0SEddie James std::string path; 102*21b177e0SEddie James /* 103*21b177e0SEddie James * @brief Mapping of RFB key code to report data index to keep track 104*21b177e0SEddie James * of which keys are down 105*21b177e0SEddie James */ 106*21b177e0SEddie James std::map<int, int> keysDown; 107*21b177e0SEddie James }; 108*21b177e0SEddie James 109*21b177e0SEddie James } // namespace ikvm 110