vncserver.hh revision 7949
17949SAli.Saidi@ARM.com/* 27949SAli.Saidi@ARM.com * Copyright (c) 2010 ARM Limited 37949SAli.Saidi@ARM.com * All rights reserved 47949SAli.Saidi@ARM.com * 57949SAli.Saidi@ARM.com * The license below extends only to copyright in the software and shall 67949SAli.Saidi@ARM.com * not be construed as granting a license to any other intellectual 77949SAli.Saidi@ARM.com * property including but not limited to intellectual property relating 87949SAli.Saidi@ARM.com * to a hardware implementation of the functionality of the software 97949SAli.Saidi@ARM.com * licensed hereunder. You may use the software subject to the license 107949SAli.Saidi@ARM.com * terms below provided that you ensure that this notice is replicated 117949SAli.Saidi@ARM.com * unmodified and in its entirety in all distributions of the software, 127949SAli.Saidi@ARM.com * modified or unmodified, in source code or in binary form. 137949SAli.Saidi@ARM.com * 147949SAli.Saidi@ARM.com * Redistribution and use in source and binary forms, with or without 157949SAli.Saidi@ARM.com * modification, are permitted provided that the following conditions are 167949SAli.Saidi@ARM.com * met: redistributions of source code must retain the above copyright 177949SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer; 187949SAli.Saidi@ARM.com * redistributions in binary form must reproduce the above copyright 197949SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer in the 207949SAli.Saidi@ARM.com * documentation and/or other materials provided with the distribution; 217949SAli.Saidi@ARM.com * neither the name of the copyright holders nor the names of its 227949SAli.Saidi@ARM.com * contributors may be used to endorse or promote products derived from 237949SAli.Saidi@ARM.com * this software without specific prior written permission. 247949SAli.Saidi@ARM.com * 257949SAli.Saidi@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 267949SAli.Saidi@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 277949SAli.Saidi@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 287949SAli.Saidi@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 297949SAli.Saidi@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 307949SAli.Saidi@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 317949SAli.Saidi@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 327949SAli.Saidi@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 337949SAli.Saidi@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 347949SAli.Saidi@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 357949SAli.Saidi@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 367949SAli.Saidi@ARM.com * 377949SAli.Saidi@ARM.com * Authors: Ali Saidi 387949SAli.Saidi@ARM.com * William Wang 397949SAli.Saidi@ARM.com */ 407949SAli.Saidi@ARM.com 417949SAli.Saidi@ARM.com/** @file 427949SAli.Saidi@ARM.com * Declaration of a VNC server 437949SAli.Saidi@ARM.com */ 447949SAli.Saidi@ARM.com 457949SAli.Saidi@ARM.com#ifndef __DEV_VNC_SERVER_HH__ 467949SAli.Saidi@ARM.com#define __DEV_VNC_SERVER_HH__ 477949SAli.Saidi@ARM.com 487949SAli.Saidi@ARM.com#include <iostream> 497949SAli.Saidi@ARM.com 507949SAli.Saidi@ARM.com#include "base/circlebuf.hh" 517949SAli.Saidi@ARM.com#include "base/pollevent.hh" 527949SAli.Saidi@ARM.com#include "base/socket.hh" 537949SAli.Saidi@ARM.com#include "base/vnc/convert.hh" 547949SAli.Saidi@ARM.com#include "cpu/intr_control.hh" 557949SAli.Saidi@ARM.com#include "sim/sim_object.hh" 567949SAli.Saidi@ARM.com#include "params/VncServer.hh" 577949SAli.Saidi@ARM.com 587949SAli.Saidi@ARM.com/** 597949SAli.Saidi@ARM.com * A device that expects to receive input from the vnc server should derrive 607949SAli.Saidi@ARM.com * (through mulitple inheritence if necessary from VncKeyboard or VncMouse 617949SAli.Saidi@ARM.com * and call setKeyboard() or setMouse() respectively on the vnc server. 627949SAli.Saidi@ARM.com */ 637949SAli.Saidi@ARM.comclass VncKeyboard 647949SAli.Saidi@ARM.com{ 657949SAli.Saidi@ARM.com public: 667949SAli.Saidi@ARM.com /** 677949SAli.Saidi@ARM.com * Called when the vnc server receives a key press event from the 687949SAli.Saidi@ARM.com * client. 697949SAli.Saidi@ARM.com * @param key the key passed is an x11 keysym 707949SAli.Saidi@ARM.com * @param down is the key now down or up? 717949SAli.Saidi@ARM.com */ 727949SAli.Saidi@ARM.com virtual void keyPress(uint32_t key, bool down) = 0; 737949SAli.Saidi@ARM.com}; 747949SAli.Saidi@ARM.com 757949SAli.Saidi@ARM.comclass VncMouse 767949SAli.Saidi@ARM.com{ 777949SAli.Saidi@ARM.com public: 787949SAli.Saidi@ARM.com /** 797949SAli.Saidi@ARM.com * called whenever the mouse moves or it's button state changes 807949SAli.Saidi@ARM.com * buttons is a simple mask with each button (0-8) corresponding to 817949SAli.Saidi@ARM.com * a bit position in the byte with 1 being down and 0 being up 827949SAli.Saidi@ARM.com * @param x the x position of the mouse 837949SAli.Saidi@ARM.com * @param y the y position of the mouse 847949SAli.Saidi@ARM.com * @param buttos the button state as described above 857949SAli.Saidi@ARM.com */ 867949SAli.Saidi@ARM.com virtual void mouseAt(uint16_t x, uint16_t y, uint8_t buttons) = 0; 877949SAli.Saidi@ARM.com}; 887949SAli.Saidi@ARM.com 897949SAli.Saidi@ARM.comclass VncServer : public SimObject 907949SAli.Saidi@ARM.com{ 917949SAli.Saidi@ARM.com public: 927949SAli.Saidi@ARM.com 937949SAli.Saidi@ARM.com /** 947949SAli.Saidi@ARM.com * \defgroup VncConstants A set of constants and structs from the VNC spec 957949SAli.Saidi@ARM.com * @{ 967949SAli.Saidi@ARM.com */ 977949SAli.Saidi@ARM.com /** Authentication modes */ 987949SAli.Saidi@ARM.com const static uint32_t AuthInvalid = 0; 997949SAli.Saidi@ARM.com const static uint32_t AuthNone = 1; 1007949SAli.Saidi@ARM.com 1017949SAli.Saidi@ARM.com /** Error conditions */ 1027949SAli.Saidi@ARM.com const static uint32_t VncOK = 0; 1037949SAli.Saidi@ARM.com 1047949SAli.Saidi@ARM.com /** Client -> Server message IDs */ 1057949SAli.Saidi@ARM.com enum ClientMessages { 1067949SAli.Saidi@ARM.com ClientSetPixelFormat = 0, 1077949SAli.Saidi@ARM.com ClientSetEncodings = 2, 1087949SAli.Saidi@ARM.com ClientFrameBufferUpdate = 3, 1097949SAli.Saidi@ARM.com ClientKeyEvent = 4, 1107949SAli.Saidi@ARM.com ClientPointerEvent = 5, 1117949SAli.Saidi@ARM.com ClientCutText = 6 1127949SAli.Saidi@ARM.com }; 1137949SAli.Saidi@ARM.com 1147949SAli.Saidi@ARM.com /** Server -> Client message IDs */ 1157949SAli.Saidi@ARM.com enum ServerMessages { 1167949SAli.Saidi@ARM.com ServerFrameBufferUpdate = 0, 1177949SAli.Saidi@ARM.com ServerSetColorMapEntries = 1, 1187949SAli.Saidi@ARM.com ServerBell = 2, 1197949SAli.Saidi@ARM.com ServerCutText = 3 1207949SAli.Saidi@ARM.com }; 1217949SAli.Saidi@ARM.com 1227949SAli.Saidi@ARM.com /** Encoding types */ 1237949SAli.Saidi@ARM.com enum EncodingTypes { 1247949SAli.Saidi@ARM.com EncodingRaw = 0, 1257949SAli.Saidi@ARM.com EncodingCopyRect = 1, 1267949SAli.Saidi@ARM.com EncodingHextile = 5, 1277949SAli.Saidi@ARM.com EncodingDesktopSize = -223 1287949SAli.Saidi@ARM.com }; 1297949SAli.Saidi@ARM.com 1307949SAli.Saidi@ARM.com /** keyboard/mouse support */ 1317949SAli.Saidi@ARM.com enum MouseEvents { 1327949SAli.Saidi@ARM.com MouseLeftButton = 0x1, 1337949SAli.Saidi@ARM.com MouseRightButton = 0x2, 1347949SAli.Saidi@ARM.com MouseMiddleButton = 0x4 1357949SAli.Saidi@ARM.com }; 1367949SAli.Saidi@ARM.com 1377949SAli.Saidi@ARM.com const char* vncVersion() const 1387949SAli.Saidi@ARM.com { 1397949SAli.Saidi@ARM.com return "RFB 003.008\n"; 1407949SAli.Saidi@ARM.com } 1417949SAli.Saidi@ARM.com 1427949SAli.Saidi@ARM.com enum ConnectionState { 1437949SAli.Saidi@ARM.com WaitForProtocolVersion, 1447949SAli.Saidi@ARM.com WaitForSecurityResponse, 1457949SAli.Saidi@ARM.com WaitForClientInit, 1467949SAli.Saidi@ARM.com InitializationPhase, 1477949SAli.Saidi@ARM.com NormalPhase 1487949SAli.Saidi@ARM.com }; 1497949SAli.Saidi@ARM.com 1507949SAli.Saidi@ARM.com struct PixelFormat { 1517949SAli.Saidi@ARM.com uint8_t bpp; 1527949SAli.Saidi@ARM.com uint8_t depth; 1537949SAli.Saidi@ARM.com uint8_t bigendian; 1547949SAli.Saidi@ARM.com uint8_t truecolor; 1557949SAli.Saidi@ARM.com uint16_t redmax; 1567949SAli.Saidi@ARM.com uint16_t greenmax; 1577949SAli.Saidi@ARM.com uint16_t bluemax; 1587949SAli.Saidi@ARM.com uint8_t redshift; 1597949SAli.Saidi@ARM.com uint8_t greenshift; 1607949SAli.Saidi@ARM.com uint8_t blueshift; 1617949SAli.Saidi@ARM.com uint8_t padding[3]; 1627949SAli.Saidi@ARM.com } M5_ATTR_PACKED; 1637949SAli.Saidi@ARM.com 1647949SAli.Saidi@ARM.com struct ServerInitMsg { 1657949SAli.Saidi@ARM.com uint16_t fbWidth; 1667949SAli.Saidi@ARM.com uint16_t fbHeight; 1677949SAli.Saidi@ARM.com PixelFormat px; 1687949SAli.Saidi@ARM.com uint32_t namelen; 1697949SAli.Saidi@ARM.com char name[2]; // just to put M5 in here 1707949SAli.Saidi@ARM.com } M5_ATTR_PACKED; 1717949SAli.Saidi@ARM.com 1727949SAli.Saidi@ARM.com struct PixelFormatMessage { 1737949SAli.Saidi@ARM.com uint8_t type; 1747949SAli.Saidi@ARM.com uint8_t padding[3]; 1757949SAli.Saidi@ARM.com PixelFormat px; 1767949SAli.Saidi@ARM.com } M5_ATTR_PACKED; 1777949SAli.Saidi@ARM.com 1787949SAli.Saidi@ARM.com struct PixelEncodingsMessage { 1797949SAli.Saidi@ARM.com uint8_t type; 1807949SAli.Saidi@ARM.com uint8_t padding; 1817949SAli.Saidi@ARM.com uint16_t num_encodings; 1827949SAli.Saidi@ARM.com } M5_ATTR_PACKED; 1837949SAli.Saidi@ARM.com 1847949SAli.Saidi@ARM.com struct FrameBufferUpdateReq { 1857949SAli.Saidi@ARM.com uint8_t type; 1867949SAli.Saidi@ARM.com uint8_t incremental; 1877949SAli.Saidi@ARM.com uint16_t x; 1887949SAli.Saidi@ARM.com uint16_t y; 1897949SAli.Saidi@ARM.com uint16_t width; 1907949SAli.Saidi@ARM.com uint16_t height; 1917949SAli.Saidi@ARM.com } M5_ATTR_PACKED; 1927949SAli.Saidi@ARM.com 1937949SAli.Saidi@ARM.com struct KeyEventMessage { 1947949SAli.Saidi@ARM.com uint8_t type; 1957949SAli.Saidi@ARM.com uint8_t down_flag; 1967949SAli.Saidi@ARM.com uint8_t padding[2]; 1977949SAli.Saidi@ARM.com uint32_t key; 1987949SAli.Saidi@ARM.com } M5_ATTR_PACKED; 1997949SAli.Saidi@ARM.com 2007949SAli.Saidi@ARM.com struct PointerEventMessage { 2017949SAli.Saidi@ARM.com uint8_t type; 2027949SAli.Saidi@ARM.com uint8_t button_mask; 2037949SAli.Saidi@ARM.com uint16_t x; 2047949SAli.Saidi@ARM.com uint16_t y; 2057949SAli.Saidi@ARM.com } M5_ATTR_PACKED; 2067949SAli.Saidi@ARM.com 2077949SAli.Saidi@ARM.com struct ClientCutTextMessage { 2087949SAli.Saidi@ARM.com uint8_t type; 2097949SAli.Saidi@ARM.com uint8_t padding[3]; 2107949SAli.Saidi@ARM.com uint32_t length; 2117949SAli.Saidi@ARM.com } M5_ATTR_PACKED; 2127949SAli.Saidi@ARM.com 2137949SAli.Saidi@ARM.com struct FrameBufferUpdate { 2147949SAli.Saidi@ARM.com uint8_t type; 2157949SAli.Saidi@ARM.com uint8_t padding; 2167949SAli.Saidi@ARM.com uint16_t num_rects; 2177949SAli.Saidi@ARM.com } M5_ATTR_PACKED; 2187949SAli.Saidi@ARM.com 2197949SAli.Saidi@ARM.com struct FrameBufferRect { 2207949SAli.Saidi@ARM.com uint16_t x; 2217949SAli.Saidi@ARM.com uint16_t y; 2227949SAli.Saidi@ARM.com uint16_t width; 2237949SAli.Saidi@ARM.com uint16_t height; 2247949SAli.Saidi@ARM.com int32_t encoding; 2257949SAli.Saidi@ARM.com } M5_ATTR_PACKED; 2267949SAli.Saidi@ARM.com 2277949SAli.Saidi@ARM.com struct ServerCutText { 2287949SAli.Saidi@ARM.com uint8_t type; 2297949SAli.Saidi@ARM.com uint8_t padding[3]; 2307949SAli.Saidi@ARM.com uint32_t length; 2317949SAli.Saidi@ARM.com } M5_ATTR_PACKED; 2327949SAli.Saidi@ARM.com 2337949SAli.Saidi@ARM.com /** @} */ 2347949SAli.Saidi@ARM.com 2357949SAli.Saidi@ARM.com protected: 2367949SAli.Saidi@ARM.com /** ListenEvent to accept a vnc client connection */ 2377949SAli.Saidi@ARM.com class ListenEvent: public PollEvent 2387949SAli.Saidi@ARM.com { 2397949SAli.Saidi@ARM.com protected: 2407949SAli.Saidi@ARM.com VncServer *vncserver; 2417949SAli.Saidi@ARM.com 2427949SAli.Saidi@ARM.com public: 2437949SAli.Saidi@ARM.com ListenEvent(VncServer *vs, int fd, int e); 2447949SAli.Saidi@ARM.com void process(int revent); 2457949SAli.Saidi@ARM.com }; 2467949SAli.Saidi@ARM.com 2477949SAli.Saidi@ARM.com friend class ListenEvent; 2487949SAli.Saidi@ARM.com ListenEvent *listenEvent; 2497949SAli.Saidi@ARM.com 2507949SAli.Saidi@ARM.com /** DataEvent to read data from vnc */ 2517949SAli.Saidi@ARM.com class DataEvent: public PollEvent 2527949SAli.Saidi@ARM.com { 2537949SAli.Saidi@ARM.com protected: 2547949SAli.Saidi@ARM.com VncServer *vncserver; 2557949SAli.Saidi@ARM.com 2567949SAli.Saidi@ARM.com public: 2577949SAli.Saidi@ARM.com DataEvent(VncServer *vs, int fd, int e); 2587949SAli.Saidi@ARM.com void process(int revent); 2597949SAli.Saidi@ARM.com }; 2607949SAli.Saidi@ARM.com 2617949SAli.Saidi@ARM.com friend class DataEvent; 2627949SAli.Saidi@ARM.com DataEvent *dataEvent; 2637949SAli.Saidi@ARM.com 2647949SAli.Saidi@ARM.com int number; 2657949SAli.Saidi@ARM.com int dataFd; // data stream file describer 2667949SAli.Saidi@ARM.com 2677949SAli.Saidi@ARM.com ListenSocket listener; 2687949SAli.Saidi@ARM.com 2697949SAli.Saidi@ARM.com void listen(int port); 2707949SAli.Saidi@ARM.com void accept(); 2717949SAli.Saidi@ARM.com void data(); 2727949SAli.Saidi@ARM.com void detach(); 2737949SAli.Saidi@ARM.com 2747949SAli.Saidi@ARM.com public: 2757949SAli.Saidi@ARM.com typedef VncServerParams Params; 2767949SAli.Saidi@ARM.com VncServer(const Params *p); 2777949SAli.Saidi@ARM.com ~VncServer(); 2787949SAli.Saidi@ARM.com 2797949SAli.Saidi@ARM.com // RFB 2807949SAli.Saidi@ARM.com protected: 2817949SAli.Saidi@ARM.com 2827949SAli.Saidi@ARM.com /** The rfb prototol state the connection is in */ 2837949SAli.Saidi@ARM.com ConnectionState curState; 2847949SAli.Saidi@ARM.com 2857949SAli.Saidi@ARM.com /** the width of the frame buffer we are sending to the client */ 2867949SAli.Saidi@ARM.com uint16_t _videoWidth; 2877949SAli.Saidi@ARM.com 2887949SAli.Saidi@ARM.com /** the height of the frame buffer we are sending to the client */ 2897949SAli.Saidi@ARM.com uint16_t _videoHeight; 2907949SAli.Saidi@ARM.com 2917949SAli.Saidi@ARM.com /** pointer to the actual data that is stored in the frame buffer device */ 2927949SAli.Saidi@ARM.com uint8_t* clientRfb; 2937949SAli.Saidi@ARM.com 2947949SAli.Saidi@ARM.com /** The device to notify when we get key events */ 2957949SAli.Saidi@ARM.com VncKeyboard *keyboard; 2967949SAli.Saidi@ARM.com 2977949SAli.Saidi@ARM.com /** The device to notify when we get mouse events */ 2987949SAli.Saidi@ARM.com VncMouse *mouse; 2997949SAli.Saidi@ARM.com 3007949SAli.Saidi@ARM.com /** An update needs to be sent to the client. Without doing this the 3017949SAli.Saidi@ARM.com * client will constantly request data that is pointless */ 3027949SAli.Saidi@ARM.com bool sendUpdate; 3037949SAli.Saidi@ARM.com 3047949SAli.Saidi@ARM.com /** The one and only pixel format we support */ 3057949SAli.Saidi@ARM.com PixelFormat pixelFormat; 3067949SAli.Saidi@ARM.com 3077949SAli.Saidi@ARM.com /** If the vnc client supports receiving raw data. It always should */ 3087949SAli.Saidi@ARM.com bool supportsRawEnc; 3097949SAli.Saidi@ARM.com 3107949SAli.Saidi@ARM.com /** If the vnc client supports the desktop resize command */ 3117949SAli.Saidi@ARM.com bool supportsResizeEnc; 3127949SAli.Saidi@ARM.com 3137949SAli.Saidi@ARM.com /** The mode of data we're getting frame buffer in */ 3147949SAli.Saidi@ARM.com VideoConvert::Mode videoMode; 3157949SAli.Saidi@ARM.com 3167949SAli.Saidi@ARM.com /** The video converter that transforms data for us */ 3177949SAli.Saidi@ARM.com VideoConvert *vc; 3187949SAli.Saidi@ARM.com 3197949SAli.Saidi@ARM.com protected: 3207949SAli.Saidi@ARM.com /** 3217949SAli.Saidi@ARM.com * vnc client Interface 3227949SAli.Saidi@ARM.com */ 3237949SAli.Saidi@ARM.com 3247949SAli.Saidi@ARM.com /** Send an error message to the client 3257949SAli.Saidi@ARM.com * @param error_msg text to send describing the error 3267949SAli.Saidi@ARM.com */ 3277949SAli.Saidi@ARM.com void sendError(const char* error_msg); 3287949SAli.Saidi@ARM.com 3297949SAli.Saidi@ARM.com /** Read some data from the client 3307949SAli.Saidi@ARM.com * @param buf the data to read 3317949SAli.Saidi@ARM.com * @param len the amount of data to read 3327949SAli.Saidi@ARM.com * @return length read 3337949SAli.Saidi@ARM.com */ 3347949SAli.Saidi@ARM.com size_t read(uint8_t *buf, size_t len); 3357949SAli.Saidi@ARM.com 3367949SAli.Saidi@ARM.com /** Read len -1 bytes from the client into the buffer provided + 1 3377949SAli.Saidi@ARM.com * assert that we read enough bytes. This function exists to handle 3387949SAli.Saidi@ARM.com * reading all of the protocol structs above when we've already read 3397949SAli.Saidi@ARM.com * the first byte which describes which one we're reading 3407949SAli.Saidi@ARM.com * @param buf the address of the buffer to add one to and read data into 3417949SAli.Saidi@ARM.com * @param len the amount of data + 1 to read 3427949SAli.Saidi@ARM.com * @return length read 3437949SAli.Saidi@ARM.com */ 3447949SAli.Saidi@ARM.com size_t read1(uint8_t *buf, size_t len); 3457949SAli.Saidi@ARM.com 3467949SAli.Saidi@ARM.com 3477949SAli.Saidi@ARM.com /** Templated version of the read function above to 3487949SAli.Saidi@ARM.com * read simple data to the client 3497949SAli.Saidi@ARM.com * @param val data to recv from the client 3507949SAli.Saidi@ARM.com */ 3517949SAli.Saidi@ARM.com template <typename T> size_t read(T* val); 3527949SAli.Saidi@ARM.com 3537949SAli.Saidi@ARM.com 3547949SAli.Saidi@ARM.com /** Write a buffer to the client. 3557949SAli.Saidi@ARM.com * @param buf buffer to send 3567949SAli.Saidi@ARM.com * @param len length of the buffer 3577949SAli.Saidi@ARM.com * @return number of bytes sent 3587949SAli.Saidi@ARM.com */ 3597949SAli.Saidi@ARM.com size_t write(const uint8_t *buf, size_t len); 3607949SAli.Saidi@ARM.com 3617949SAli.Saidi@ARM.com /** Templated version of the write function above to 3627949SAli.Saidi@ARM.com * write simple data to the client 3637949SAli.Saidi@ARM.com * @param val data to send to the client 3647949SAli.Saidi@ARM.com */ 3657949SAli.Saidi@ARM.com template <typename T> size_t write(T* val); 3667949SAli.Saidi@ARM.com 3677949SAli.Saidi@ARM.com /** Send a string to the client 3687949SAli.Saidi@ARM.com * @param str string to transmit 3697949SAli.Saidi@ARM.com */ 3707949SAli.Saidi@ARM.com size_t write(const char* str); 3717949SAli.Saidi@ARM.com 3727949SAli.Saidi@ARM.com /** Check the client's protocol verion for compatibility and send 3737949SAli.Saidi@ARM.com * the security types we support 3747949SAli.Saidi@ARM.com */ 3757949SAli.Saidi@ARM.com void checkProtocolVersion(); 3767949SAli.Saidi@ARM.com 3777949SAli.Saidi@ARM.com /** Check that the security exchange was successful 3787949SAli.Saidi@ARM.com */ 3797949SAli.Saidi@ARM.com void checkSecurity(); 3807949SAli.Saidi@ARM.com 3817949SAli.Saidi@ARM.com /** Send client our idea about what the frame buffer looks like */ 3827949SAli.Saidi@ARM.com void sendServerInit(); 3837949SAli.Saidi@ARM.com 3847949SAli.Saidi@ARM.com /** Send an error message to the client when something goes wrong 3857949SAli.Saidi@ARM.com * @param error_msg error to send 3867949SAli.Saidi@ARM.com */ 3877949SAli.Saidi@ARM.com void sendError(std::string error_msg); 3887949SAli.Saidi@ARM.com 3897949SAli.Saidi@ARM.com /** Send a updated frame buffer to the client. 3907949SAli.Saidi@ARM.com * @todo this doesn't do anything smart and just sends the entire image 3917949SAli.Saidi@ARM.com */ 3927949SAli.Saidi@ARM.com void sendFrameBufferUpdate(); 3937949SAli.Saidi@ARM.com 3947949SAli.Saidi@ARM.com /** Receive pixel foramt message from client and process it. */ 3957949SAli.Saidi@ARM.com void setPixelFormat(); 3967949SAli.Saidi@ARM.com 3977949SAli.Saidi@ARM.com /** Receive encodings message from client and process it. */ 3987949SAli.Saidi@ARM.com void setEncodings(); 3997949SAli.Saidi@ARM.com 4007949SAli.Saidi@ARM.com /** Receive message from client asking for updated frame buffer */ 4017949SAli.Saidi@ARM.com void requestFbUpdate(); 4027949SAli.Saidi@ARM.com 4037949SAli.Saidi@ARM.com /** Receive message from client providing new keyboard input */ 4047949SAli.Saidi@ARM.com void recvKeyboardInput(); 4057949SAli.Saidi@ARM.com 4067949SAli.Saidi@ARM.com /** Recv message from client providing new mouse movement or button click */ 4077949SAli.Saidi@ARM.com void recvPointerInput(); 4087949SAli.Saidi@ARM.com 4097949SAli.Saidi@ARM.com /** Receive message from client that there is text in it's paste buffer. 4107949SAli.Saidi@ARM.com * This is a no-op at the moment, but perhaps we would want to be able to 4117949SAli.Saidi@ARM.com * paste it at some point. 4127949SAli.Saidi@ARM.com */ 4137949SAli.Saidi@ARM.com void recvCutText(); 4147949SAli.Saidi@ARM.com 4157949SAli.Saidi@ARM.com /** Tell the client that the frame buffer resized. This happens when the 4167949SAli.Saidi@ARM.com * simulated system changes video modes (E.g. X11 starts). 4177949SAli.Saidi@ARM.com */ 4187949SAli.Saidi@ARM.com void sendFrameBufferResized(); 4197949SAli.Saidi@ARM.com 4207949SAli.Saidi@ARM.com public: 4217949SAli.Saidi@ARM.com /** Set the address of the frame buffer we are going to show. 4227949SAli.Saidi@ARM.com * To avoid copying, just have the display controller 4237949SAli.Saidi@ARM.com * tell us where the data is instead of constanly copying it around 4247949SAli.Saidi@ARM.com * @param rfb frame buffer that we're going to use 4257949SAli.Saidi@ARM.com */ 4267949SAli.Saidi@ARM.com void 4277949SAli.Saidi@ARM.com setFramebufferAddr(uint8_t* rfb) 4287949SAli.Saidi@ARM.com { 4297949SAli.Saidi@ARM.com clientRfb = rfb; 4307949SAli.Saidi@ARM.com } 4317949SAli.Saidi@ARM.com 4327949SAli.Saidi@ARM.com /** Set up the device that would like to receive notifications when keys are 4337949SAli.Saidi@ARM.com * pressed in the vnc client keyboard 4347949SAli.Saidi@ARM.com * @param _keyboard an object that derrives from VncKeyboard 4357949SAli.Saidi@ARM.com */ 4367949SAli.Saidi@ARM.com void setKeyboard(VncKeyboard *_keyboard) { keyboard = _keyboard; } 4377949SAli.Saidi@ARM.com 4387949SAli.Saidi@ARM.com /** Setup the device that would like to receive notifications when mouse 4397949SAli.Saidi@ARM.com * movements or button presses are received from the vnc client. 4407949SAli.Saidi@ARM.com * @param _mouse an object that derrives from VncMouse 4417949SAli.Saidi@ARM.com */ 4427949SAli.Saidi@ARM.com void setMouse(VncMouse *_mouse) { mouse = _mouse; } 4437949SAli.Saidi@ARM.com 4447949SAli.Saidi@ARM.com /** The frame buffer uses this call to notify the vnc server that 4457949SAli.Saidi@ARM.com * the frame buffer has been updated and a new image needs to be sent to the 4467949SAli.Saidi@ARM.com * client 4477949SAli.Saidi@ARM.com */ 4487949SAli.Saidi@ARM.com void 4497949SAli.Saidi@ARM.com setDirty() 4507949SAli.Saidi@ARM.com { 4517949SAli.Saidi@ARM.com sendUpdate = true; 4527949SAli.Saidi@ARM.com sendFrameBufferUpdate(); 4537949SAli.Saidi@ARM.com } 4547949SAli.Saidi@ARM.com 4557949SAli.Saidi@ARM.com /** What is the width of the screen we're displaying. 4567949SAli.Saidi@ARM.com * This is used for pointer/tablet devices that need to know to calculate 4577949SAli.Saidi@ARM.com * the correct value to send to the device driver. 4587949SAli.Saidi@ARM.com * @return the width of the simulated screen 4597949SAli.Saidi@ARM.com */ 4607949SAli.Saidi@ARM.com uint16_t videoWidth() { return _videoWidth; } 4617949SAli.Saidi@ARM.com 4627949SAli.Saidi@ARM.com /** What is the height of the screen we're displaying. 4637949SAli.Saidi@ARM.com * This is used for pointer/tablet devices that need to know to calculate 4647949SAli.Saidi@ARM.com * the correct value to send to the device driver. 4657949SAli.Saidi@ARM.com * @return the height of the simulated screen 4667949SAli.Saidi@ARM.com */ 4677949SAli.Saidi@ARM.com uint16_t videoHeight() { return _videoHeight; } 4687949SAli.Saidi@ARM.com 4697949SAli.Saidi@ARM.com /** Set the mode of the data the frame buffer will be sending us 4707949SAli.Saidi@ARM.com * @param mode the mode 4717949SAli.Saidi@ARM.com */ 4727949SAli.Saidi@ARM.com void setFrameBufferParams(VideoConvert::Mode mode, int width, int height); 4737949SAli.Saidi@ARM.com}; 4747949SAli.Saidi@ARM.com 4757949SAli.Saidi@ARM.com#endif 476