vncserver.hh revision 8635
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 508229Snate@binkert.org#include "base/vnc/convert.hh" 518635Schris.emmons@arm.com#include "base/bitmap.hh" 527949SAli.Saidi@ARM.com#include "base/circlebuf.hh" 537949SAli.Saidi@ARM.com#include "base/pollevent.hh" 547949SAli.Saidi@ARM.com#include "base/socket.hh" 557949SAli.Saidi@ARM.com#include "cpu/intr_control.hh" 568229Snate@binkert.org#include "params/VncServer.hh" 577949SAli.Saidi@ARM.com#include "sim/sim_object.hh" 587949SAli.Saidi@ARM.com 598635Schris.emmons@arm.com 607949SAli.Saidi@ARM.com/** 617949SAli.Saidi@ARM.com * A device that expects to receive input from the vnc server should derrive 627949SAli.Saidi@ARM.com * (through mulitple inheritence if necessary from VncKeyboard or VncMouse 637949SAli.Saidi@ARM.com * and call setKeyboard() or setMouse() respectively on the vnc server. 647949SAli.Saidi@ARM.com */ 657949SAli.Saidi@ARM.comclass VncKeyboard 667949SAli.Saidi@ARM.com{ 677949SAli.Saidi@ARM.com public: 687949SAli.Saidi@ARM.com /** 697949SAli.Saidi@ARM.com * Called when the vnc server receives a key press event from the 707949SAli.Saidi@ARM.com * client. 717949SAli.Saidi@ARM.com * @param key the key passed is an x11 keysym 727949SAli.Saidi@ARM.com * @param down is the key now down or up? 737949SAli.Saidi@ARM.com */ 747949SAli.Saidi@ARM.com virtual void keyPress(uint32_t key, bool down) = 0; 757949SAli.Saidi@ARM.com}; 767949SAli.Saidi@ARM.com 777949SAli.Saidi@ARM.comclass VncMouse 787949SAli.Saidi@ARM.com{ 797949SAli.Saidi@ARM.com public: 807949SAli.Saidi@ARM.com /** 817949SAli.Saidi@ARM.com * called whenever the mouse moves or it's button state changes 827949SAli.Saidi@ARM.com * buttons is a simple mask with each button (0-8) corresponding to 837949SAli.Saidi@ARM.com * a bit position in the byte with 1 being down and 0 being up 847949SAli.Saidi@ARM.com * @param x the x position of the mouse 857949SAli.Saidi@ARM.com * @param y the y position of the mouse 867949SAli.Saidi@ARM.com * @param buttos the button state as described above 877949SAli.Saidi@ARM.com */ 887949SAli.Saidi@ARM.com virtual void mouseAt(uint16_t x, uint16_t y, uint8_t buttons) = 0; 897949SAli.Saidi@ARM.com}; 907949SAli.Saidi@ARM.com 917949SAli.Saidi@ARM.comclass VncServer : public SimObject 927949SAli.Saidi@ARM.com{ 937949SAli.Saidi@ARM.com public: 947949SAli.Saidi@ARM.com 957949SAli.Saidi@ARM.com /** 967949SAli.Saidi@ARM.com * \defgroup VncConstants A set of constants and structs from the VNC spec 977949SAli.Saidi@ARM.com * @{ 987949SAli.Saidi@ARM.com */ 997949SAli.Saidi@ARM.com /** Authentication modes */ 1007949SAli.Saidi@ARM.com const static uint32_t AuthInvalid = 0; 1017949SAli.Saidi@ARM.com const static uint32_t AuthNone = 1; 1027949SAli.Saidi@ARM.com 1037949SAli.Saidi@ARM.com /** Error conditions */ 1047949SAli.Saidi@ARM.com const static uint32_t VncOK = 0; 1057949SAli.Saidi@ARM.com 1067949SAli.Saidi@ARM.com /** Client -> Server message IDs */ 1077949SAli.Saidi@ARM.com enum ClientMessages { 1087949SAli.Saidi@ARM.com ClientSetPixelFormat = 0, 1097949SAli.Saidi@ARM.com ClientSetEncodings = 2, 1107949SAli.Saidi@ARM.com ClientFrameBufferUpdate = 3, 1117949SAli.Saidi@ARM.com ClientKeyEvent = 4, 1127949SAli.Saidi@ARM.com ClientPointerEvent = 5, 1137949SAli.Saidi@ARM.com ClientCutText = 6 1147949SAli.Saidi@ARM.com }; 1157949SAli.Saidi@ARM.com 1167949SAli.Saidi@ARM.com /** Server -> Client message IDs */ 1177949SAli.Saidi@ARM.com enum ServerMessages { 1187949SAli.Saidi@ARM.com ServerFrameBufferUpdate = 0, 1197949SAli.Saidi@ARM.com ServerSetColorMapEntries = 1, 1207949SAli.Saidi@ARM.com ServerBell = 2, 1217949SAli.Saidi@ARM.com ServerCutText = 3 1227949SAli.Saidi@ARM.com }; 1237949SAli.Saidi@ARM.com 1247949SAli.Saidi@ARM.com /** Encoding types */ 1257949SAli.Saidi@ARM.com enum EncodingTypes { 1267949SAli.Saidi@ARM.com EncodingRaw = 0, 1277949SAli.Saidi@ARM.com EncodingCopyRect = 1, 1287949SAli.Saidi@ARM.com EncodingHextile = 5, 1297949SAli.Saidi@ARM.com EncodingDesktopSize = -223 1307949SAli.Saidi@ARM.com }; 1317949SAli.Saidi@ARM.com 1327949SAli.Saidi@ARM.com /** keyboard/mouse support */ 1337949SAli.Saidi@ARM.com enum MouseEvents { 1347949SAli.Saidi@ARM.com MouseLeftButton = 0x1, 1357949SAli.Saidi@ARM.com MouseRightButton = 0x2, 1367949SAli.Saidi@ARM.com MouseMiddleButton = 0x4 1377949SAli.Saidi@ARM.com }; 1387949SAli.Saidi@ARM.com 1397949SAli.Saidi@ARM.com const char* vncVersion() const 1407949SAli.Saidi@ARM.com { 1417949SAli.Saidi@ARM.com return "RFB 003.008\n"; 1427949SAli.Saidi@ARM.com } 1437949SAli.Saidi@ARM.com 1447949SAli.Saidi@ARM.com enum ConnectionState { 1457949SAli.Saidi@ARM.com WaitForProtocolVersion, 1467949SAli.Saidi@ARM.com WaitForSecurityResponse, 1477949SAli.Saidi@ARM.com WaitForClientInit, 1487949SAli.Saidi@ARM.com InitializationPhase, 1497949SAli.Saidi@ARM.com NormalPhase 1507949SAli.Saidi@ARM.com }; 1517949SAli.Saidi@ARM.com 1527949SAli.Saidi@ARM.com struct PixelFormat { 1537949SAli.Saidi@ARM.com uint8_t bpp; 1547949SAli.Saidi@ARM.com uint8_t depth; 1557949SAli.Saidi@ARM.com uint8_t bigendian; 1567949SAli.Saidi@ARM.com uint8_t truecolor; 1577949SAli.Saidi@ARM.com uint16_t redmax; 1587949SAli.Saidi@ARM.com uint16_t greenmax; 1597949SAli.Saidi@ARM.com uint16_t bluemax; 1607949SAli.Saidi@ARM.com uint8_t redshift; 1617949SAli.Saidi@ARM.com uint8_t greenshift; 1627949SAli.Saidi@ARM.com uint8_t blueshift; 1637949SAli.Saidi@ARM.com uint8_t padding[3]; 1647949SAli.Saidi@ARM.com } M5_ATTR_PACKED; 1657949SAli.Saidi@ARM.com 1667949SAli.Saidi@ARM.com struct ServerInitMsg { 1677949SAli.Saidi@ARM.com uint16_t fbWidth; 1687949SAli.Saidi@ARM.com uint16_t fbHeight; 1697949SAli.Saidi@ARM.com PixelFormat px; 1707949SAli.Saidi@ARM.com uint32_t namelen; 1717949SAli.Saidi@ARM.com char name[2]; // just to put M5 in here 1727949SAli.Saidi@ARM.com } M5_ATTR_PACKED; 1737949SAli.Saidi@ARM.com 1747949SAli.Saidi@ARM.com struct PixelFormatMessage { 1757949SAli.Saidi@ARM.com uint8_t type; 1767949SAli.Saidi@ARM.com uint8_t padding[3]; 1777949SAli.Saidi@ARM.com PixelFormat px; 1787949SAli.Saidi@ARM.com } M5_ATTR_PACKED; 1797949SAli.Saidi@ARM.com 1807949SAli.Saidi@ARM.com struct PixelEncodingsMessage { 1817949SAli.Saidi@ARM.com uint8_t type; 1827949SAli.Saidi@ARM.com uint8_t padding; 1837949SAli.Saidi@ARM.com uint16_t num_encodings; 1847949SAli.Saidi@ARM.com } M5_ATTR_PACKED; 1857949SAli.Saidi@ARM.com 1867949SAli.Saidi@ARM.com struct FrameBufferUpdateReq { 1877949SAli.Saidi@ARM.com uint8_t type; 1887949SAli.Saidi@ARM.com uint8_t incremental; 1897949SAli.Saidi@ARM.com uint16_t x; 1907949SAli.Saidi@ARM.com uint16_t y; 1917949SAli.Saidi@ARM.com uint16_t width; 1927949SAli.Saidi@ARM.com uint16_t height; 1937949SAli.Saidi@ARM.com } M5_ATTR_PACKED; 1947949SAli.Saidi@ARM.com 1957949SAli.Saidi@ARM.com struct KeyEventMessage { 1967949SAli.Saidi@ARM.com uint8_t type; 1977949SAli.Saidi@ARM.com uint8_t down_flag; 1987949SAli.Saidi@ARM.com uint8_t padding[2]; 1997949SAli.Saidi@ARM.com uint32_t key; 2007949SAli.Saidi@ARM.com } M5_ATTR_PACKED; 2017949SAli.Saidi@ARM.com 2027949SAli.Saidi@ARM.com struct PointerEventMessage { 2037949SAli.Saidi@ARM.com uint8_t type; 2047949SAli.Saidi@ARM.com uint8_t button_mask; 2057949SAli.Saidi@ARM.com uint16_t x; 2067949SAli.Saidi@ARM.com uint16_t y; 2077949SAli.Saidi@ARM.com } M5_ATTR_PACKED; 2087949SAli.Saidi@ARM.com 2097949SAli.Saidi@ARM.com struct ClientCutTextMessage { 2107949SAli.Saidi@ARM.com uint8_t type; 2117949SAli.Saidi@ARM.com uint8_t padding[3]; 2127949SAli.Saidi@ARM.com uint32_t length; 2137949SAli.Saidi@ARM.com } M5_ATTR_PACKED; 2147949SAli.Saidi@ARM.com 2157949SAli.Saidi@ARM.com struct FrameBufferUpdate { 2167949SAli.Saidi@ARM.com uint8_t type; 2177949SAli.Saidi@ARM.com uint8_t padding; 2187949SAli.Saidi@ARM.com uint16_t num_rects; 2197949SAli.Saidi@ARM.com } M5_ATTR_PACKED; 2207949SAli.Saidi@ARM.com 2217949SAli.Saidi@ARM.com struct FrameBufferRect { 2227949SAli.Saidi@ARM.com uint16_t x; 2237949SAli.Saidi@ARM.com uint16_t y; 2247949SAli.Saidi@ARM.com uint16_t width; 2257949SAli.Saidi@ARM.com uint16_t height; 2267949SAli.Saidi@ARM.com int32_t encoding; 2277949SAli.Saidi@ARM.com } M5_ATTR_PACKED; 2287949SAli.Saidi@ARM.com 2297949SAli.Saidi@ARM.com struct ServerCutText { 2307949SAli.Saidi@ARM.com uint8_t type; 2317949SAli.Saidi@ARM.com uint8_t padding[3]; 2327949SAli.Saidi@ARM.com uint32_t length; 2337949SAli.Saidi@ARM.com } M5_ATTR_PACKED; 2347949SAli.Saidi@ARM.com 2357949SAli.Saidi@ARM.com /** @} */ 2367949SAli.Saidi@ARM.com 2377949SAli.Saidi@ARM.com protected: 2387949SAli.Saidi@ARM.com /** ListenEvent to accept a vnc client connection */ 2397949SAli.Saidi@ARM.com class ListenEvent: public PollEvent 2407949SAli.Saidi@ARM.com { 2417949SAli.Saidi@ARM.com protected: 2427949SAli.Saidi@ARM.com VncServer *vncserver; 2437949SAli.Saidi@ARM.com 2447949SAli.Saidi@ARM.com public: 2457949SAli.Saidi@ARM.com ListenEvent(VncServer *vs, int fd, int e); 2467949SAli.Saidi@ARM.com void process(int revent); 2477949SAli.Saidi@ARM.com }; 2487949SAli.Saidi@ARM.com 2497949SAli.Saidi@ARM.com friend class ListenEvent; 2507949SAli.Saidi@ARM.com ListenEvent *listenEvent; 2517949SAli.Saidi@ARM.com 2527949SAli.Saidi@ARM.com /** DataEvent to read data from vnc */ 2537949SAli.Saidi@ARM.com class DataEvent: public PollEvent 2547949SAli.Saidi@ARM.com { 2557949SAli.Saidi@ARM.com protected: 2567949SAli.Saidi@ARM.com VncServer *vncserver; 2577949SAli.Saidi@ARM.com 2587949SAli.Saidi@ARM.com public: 2597949SAli.Saidi@ARM.com DataEvent(VncServer *vs, int fd, int e); 2607949SAli.Saidi@ARM.com void process(int revent); 2617949SAli.Saidi@ARM.com }; 2627949SAli.Saidi@ARM.com 2637949SAli.Saidi@ARM.com friend class DataEvent; 2647949SAli.Saidi@ARM.com DataEvent *dataEvent; 2657949SAli.Saidi@ARM.com 2667949SAli.Saidi@ARM.com int number; 2677949SAli.Saidi@ARM.com int dataFd; // data stream file describer 2687949SAli.Saidi@ARM.com 2697949SAli.Saidi@ARM.com ListenSocket listener; 2707949SAli.Saidi@ARM.com 2717949SAli.Saidi@ARM.com void listen(int port); 2727949SAli.Saidi@ARM.com void accept(); 2737949SAli.Saidi@ARM.com void data(); 2747949SAli.Saidi@ARM.com void detach(); 2757949SAli.Saidi@ARM.com 2767949SAli.Saidi@ARM.com public: 2777949SAli.Saidi@ARM.com typedef VncServerParams Params; 2787949SAli.Saidi@ARM.com VncServer(const Params *p); 2797949SAli.Saidi@ARM.com ~VncServer(); 2807949SAli.Saidi@ARM.com 2817949SAli.Saidi@ARM.com // RFB 2827949SAli.Saidi@ARM.com protected: 2837949SAli.Saidi@ARM.com 2847949SAli.Saidi@ARM.com /** The rfb prototol state the connection is in */ 2857949SAli.Saidi@ARM.com ConnectionState curState; 2867949SAli.Saidi@ARM.com 2877949SAli.Saidi@ARM.com /** the width of the frame buffer we are sending to the client */ 2887949SAli.Saidi@ARM.com uint16_t _videoWidth; 2897949SAli.Saidi@ARM.com 2907949SAli.Saidi@ARM.com /** the height of the frame buffer we are sending to the client */ 2917949SAli.Saidi@ARM.com uint16_t _videoHeight; 2927949SAli.Saidi@ARM.com 2937949SAli.Saidi@ARM.com /** pointer to the actual data that is stored in the frame buffer device */ 2947949SAli.Saidi@ARM.com uint8_t* clientRfb; 2957949SAli.Saidi@ARM.com 2967949SAli.Saidi@ARM.com /** The device to notify when we get key events */ 2977949SAli.Saidi@ARM.com VncKeyboard *keyboard; 2987949SAli.Saidi@ARM.com 2997949SAli.Saidi@ARM.com /** The device to notify when we get mouse events */ 3007949SAli.Saidi@ARM.com VncMouse *mouse; 3017949SAli.Saidi@ARM.com 3027949SAli.Saidi@ARM.com /** An update needs to be sent to the client. Without doing this the 3037949SAli.Saidi@ARM.com * client will constantly request data that is pointless */ 3047949SAli.Saidi@ARM.com bool sendUpdate; 3057949SAli.Saidi@ARM.com 3067949SAli.Saidi@ARM.com /** The one and only pixel format we support */ 3077949SAli.Saidi@ARM.com PixelFormat pixelFormat; 3087949SAli.Saidi@ARM.com 3097949SAli.Saidi@ARM.com /** If the vnc client supports receiving raw data. It always should */ 3107949SAli.Saidi@ARM.com bool supportsRawEnc; 3117949SAli.Saidi@ARM.com 3127949SAli.Saidi@ARM.com /** If the vnc client supports the desktop resize command */ 3137949SAli.Saidi@ARM.com bool supportsResizeEnc; 3147949SAli.Saidi@ARM.com 3157949SAli.Saidi@ARM.com /** The mode of data we're getting frame buffer in */ 3167949SAli.Saidi@ARM.com VideoConvert::Mode videoMode; 3177949SAli.Saidi@ARM.com 3187949SAli.Saidi@ARM.com /** The video converter that transforms data for us */ 3197949SAli.Saidi@ARM.com VideoConvert *vc; 3207949SAli.Saidi@ARM.com 3218635Schris.emmons@arm.com /** Flag indicating whether to capture snapshots of frame buffer or not */ 3228635Schris.emmons@arm.com bool captureEnabled; 3238635Schris.emmons@arm.com 3248635Schris.emmons@arm.com /** Current frame number being captured to a file */ 3258635Schris.emmons@arm.com int captureCurrentFrame; 3268635Schris.emmons@arm.com 3278635Schris.emmons@arm.com /** Directory to store captured frames to */ 3288635Schris.emmons@arm.com std::string captureOutputDirectory; 3298635Schris.emmons@arm.com 3308635Schris.emmons@arm.com /** Computed hash of the last captured frame */ 3318635Schris.emmons@arm.com uint64_t captureLastHash; 3328635Schris.emmons@arm.com 3338635Schris.emmons@arm.com /** Cached bitmap object for writing out frame buffers to file */ 3348635Schris.emmons@arm.com Bitmap *captureBitmap; 3358635Schris.emmons@arm.com 3367949SAli.Saidi@ARM.com protected: 3378635Schris.emmons@arm.com /** Captures the current frame buffer to a file */ 3388635Schris.emmons@arm.com void captureFrameBuffer(); 3398635Schris.emmons@arm.com 3407949SAli.Saidi@ARM.com /** 3417949SAli.Saidi@ARM.com * vnc client Interface 3427949SAli.Saidi@ARM.com */ 3437949SAli.Saidi@ARM.com 3447949SAli.Saidi@ARM.com /** Send an error message to the client 3457949SAli.Saidi@ARM.com * @param error_msg text to send describing the error 3467949SAli.Saidi@ARM.com */ 3477949SAli.Saidi@ARM.com void sendError(const char* error_msg); 3487949SAli.Saidi@ARM.com 3497949SAli.Saidi@ARM.com /** Read some data from the client 3507949SAli.Saidi@ARM.com * @param buf the data to read 3517949SAli.Saidi@ARM.com * @param len the amount of data to read 3527949SAli.Saidi@ARM.com * @return length read 3537949SAli.Saidi@ARM.com */ 3547949SAli.Saidi@ARM.com size_t read(uint8_t *buf, size_t len); 3557949SAli.Saidi@ARM.com 3567949SAli.Saidi@ARM.com /** Read len -1 bytes from the client into the buffer provided + 1 3577949SAli.Saidi@ARM.com * assert that we read enough bytes. This function exists to handle 3587949SAli.Saidi@ARM.com * reading all of the protocol structs above when we've already read 3597949SAli.Saidi@ARM.com * the first byte which describes which one we're reading 3607949SAli.Saidi@ARM.com * @param buf the address of the buffer to add one to and read data into 3617949SAli.Saidi@ARM.com * @param len the amount of data + 1 to read 3627949SAli.Saidi@ARM.com * @return length read 3637949SAli.Saidi@ARM.com */ 3647949SAli.Saidi@ARM.com size_t read1(uint8_t *buf, size_t len); 3657949SAli.Saidi@ARM.com 3667949SAli.Saidi@ARM.com 3677949SAli.Saidi@ARM.com /** Templated version of the read function above to 3687949SAli.Saidi@ARM.com * read simple data to the client 3697949SAli.Saidi@ARM.com * @param val data to recv from the client 3707949SAli.Saidi@ARM.com */ 3717949SAli.Saidi@ARM.com template <typename T> size_t read(T* val); 3727949SAli.Saidi@ARM.com 3737949SAli.Saidi@ARM.com 3747949SAli.Saidi@ARM.com /** Write a buffer to the client. 3757949SAli.Saidi@ARM.com * @param buf buffer to send 3767949SAli.Saidi@ARM.com * @param len length of the buffer 3777949SAli.Saidi@ARM.com * @return number of bytes sent 3787949SAli.Saidi@ARM.com */ 3797949SAli.Saidi@ARM.com size_t write(const uint8_t *buf, size_t len); 3807949SAli.Saidi@ARM.com 3817949SAli.Saidi@ARM.com /** Templated version of the write function above to 3827949SAli.Saidi@ARM.com * write simple data to the client 3837949SAli.Saidi@ARM.com * @param val data to send to the client 3847949SAli.Saidi@ARM.com */ 3857949SAli.Saidi@ARM.com template <typename T> size_t write(T* val); 3867949SAli.Saidi@ARM.com 3877949SAli.Saidi@ARM.com /** Send a string to the client 3887949SAli.Saidi@ARM.com * @param str string to transmit 3897949SAli.Saidi@ARM.com */ 3907949SAli.Saidi@ARM.com size_t write(const char* str); 3917949SAli.Saidi@ARM.com 3927949SAli.Saidi@ARM.com /** Check the client's protocol verion for compatibility and send 3937949SAli.Saidi@ARM.com * the security types we support 3947949SAli.Saidi@ARM.com */ 3957949SAli.Saidi@ARM.com void checkProtocolVersion(); 3967949SAli.Saidi@ARM.com 3977949SAli.Saidi@ARM.com /** Check that the security exchange was successful 3987949SAli.Saidi@ARM.com */ 3997949SAli.Saidi@ARM.com void checkSecurity(); 4007949SAli.Saidi@ARM.com 4017949SAli.Saidi@ARM.com /** Send client our idea about what the frame buffer looks like */ 4027949SAli.Saidi@ARM.com void sendServerInit(); 4037949SAli.Saidi@ARM.com 4047949SAli.Saidi@ARM.com /** Send an error message to the client when something goes wrong 4057949SAli.Saidi@ARM.com * @param error_msg error to send 4067949SAli.Saidi@ARM.com */ 4077949SAli.Saidi@ARM.com void sendError(std::string error_msg); 4087949SAli.Saidi@ARM.com 4097949SAli.Saidi@ARM.com /** Send a updated frame buffer to the client. 4107949SAli.Saidi@ARM.com * @todo this doesn't do anything smart and just sends the entire image 4117949SAli.Saidi@ARM.com */ 4127949SAli.Saidi@ARM.com void sendFrameBufferUpdate(); 4137949SAli.Saidi@ARM.com 4147949SAli.Saidi@ARM.com /** Receive pixel foramt message from client and process it. */ 4157949SAli.Saidi@ARM.com void setPixelFormat(); 4167949SAli.Saidi@ARM.com 4177949SAli.Saidi@ARM.com /** Receive encodings message from client and process it. */ 4187949SAli.Saidi@ARM.com void setEncodings(); 4197949SAli.Saidi@ARM.com 4207949SAli.Saidi@ARM.com /** Receive message from client asking for updated frame buffer */ 4217949SAli.Saidi@ARM.com void requestFbUpdate(); 4227949SAli.Saidi@ARM.com 4237949SAli.Saidi@ARM.com /** Receive message from client providing new keyboard input */ 4247949SAli.Saidi@ARM.com void recvKeyboardInput(); 4257949SAli.Saidi@ARM.com 4267949SAli.Saidi@ARM.com /** Recv message from client providing new mouse movement or button click */ 4277949SAli.Saidi@ARM.com void recvPointerInput(); 4287949SAli.Saidi@ARM.com 4297949SAli.Saidi@ARM.com /** Receive message from client that there is text in it's paste buffer. 4307949SAli.Saidi@ARM.com * This is a no-op at the moment, but perhaps we would want to be able to 4317949SAli.Saidi@ARM.com * paste it at some point. 4327949SAli.Saidi@ARM.com */ 4337949SAli.Saidi@ARM.com void recvCutText(); 4347949SAli.Saidi@ARM.com 4357949SAli.Saidi@ARM.com /** Tell the client that the frame buffer resized. This happens when the 4367949SAli.Saidi@ARM.com * simulated system changes video modes (E.g. X11 starts). 4377949SAli.Saidi@ARM.com */ 4387949SAli.Saidi@ARM.com void sendFrameBufferResized(); 4397949SAli.Saidi@ARM.com 4407949SAli.Saidi@ARM.com public: 4417949SAli.Saidi@ARM.com /** Set the address of the frame buffer we are going to show. 4427949SAli.Saidi@ARM.com * To avoid copying, just have the display controller 4437949SAli.Saidi@ARM.com * tell us where the data is instead of constanly copying it around 4447949SAli.Saidi@ARM.com * @param rfb frame buffer that we're going to use 4457949SAli.Saidi@ARM.com */ 4467949SAli.Saidi@ARM.com void 4477949SAli.Saidi@ARM.com setFramebufferAddr(uint8_t* rfb) 4487949SAli.Saidi@ARM.com { 4497949SAli.Saidi@ARM.com clientRfb = rfb; 4507949SAli.Saidi@ARM.com } 4517949SAli.Saidi@ARM.com 4527949SAli.Saidi@ARM.com /** Set up the device that would like to receive notifications when keys are 4537949SAli.Saidi@ARM.com * pressed in the vnc client keyboard 4547949SAli.Saidi@ARM.com * @param _keyboard an object that derrives from VncKeyboard 4557949SAli.Saidi@ARM.com */ 4567949SAli.Saidi@ARM.com void setKeyboard(VncKeyboard *_keyboard) { keyboard = _keyboard; } 4577949SAli.Saidi@ARM.com 4587949SAli.Saidi@ARM.com /** Setup the device that would like to receive notifications when mouse 4597949SAli.Saidi@ARM.com * movements or button presses are received from the vnc client. 4607949SAli.Saidi@ARM.com * @param _mouse an object that derrives from VncMouse 4617949SAli.Saidi@ARM.com */ 4627949SAli.Saidi@ARM.com void setMouse(VncMouse *_mouse) { mouse = _mouse; } 4637949SAli.Saidi@ARM.com 4647949SAli.Saidi@ARM.com /** The frame buffer uses this call to notify the vnc server that 4657949SAli.Saidi@ARM.com * the frame buffer has been updated and a new image needs to be sent to the 4667949SAli.Saidi@ARM.com * client 4677949SAli.Saidi@ARM.com */ 4687949SAli.Saidi@ARM.com void 4697949SAli.Saidi@ARM.com setDirty() 4707949SAli.Saidi@ARM.com { 4717949SAli.Saidi@ARM.com sendUpdate = true; 4728635Schris.emmons@arm.com if (captureEnabled) 4738635Schris.emmons@arm.com captureFrameBuffer(); 4747949SAli.Saidi@ARM.com sendFrameBufferUpdate(); 4757949SAli.Saidi@ARM.com } 4767949SAli.Saidi@ARM.com 4777949SAli.Saidi@ARM.com /** What is the width of the screen we're displaying. 4787949SAli.Saidi@ARM.com * This is used for pointer/tablet devices that need to know to calculate 4797949SAli.Saidi@ARM.com * the correct value to send to the device driver. 4807949SAli.Saidi@ARM.com * @return the width of the simulated screen 4817949SAli.Saidi@ARM.com */ 4827949SAli.Saidi@ARM.com uint16_t videoWidth() { return _videoWidth; } 4837949SAli.Saidi@ARM.com 4847949SAli.Saidi@ARM.com /** What is the height of the screen we're displaying. 4857949SAli.Saidi@ARM.com * This is used for pointer/tablet devices that need to know to calculate 4867949SAli.Saidi@ARM.com * the correct value to send to the device driver. 4877949SAli.Saidi@ARM.com * @return the height of the simulated screen 4887949SAli.Saidi@ARM.com */ 4897949SAli.Saidi@ARM.com uint16_t videoHeight() { return _videoHeight; } 4907949SAli.Saidi@ARM.com 4917949SAli.Saidi@ARM.com /** Set the mode of the data the frame buffer will be sending us 4927949SAli.Saidi@ARM.com * @param mode the mode 4937949SAli.Saidi@ARM.com */ 4947949SAli.Saidi@ARM.com void setFrameBufferParams(VideoConvert::Mode mode, int width, int height); 4957949SAli.Saidi@ARM.com}; 4967949SAli.Saidi@ARM.com 4977949SAli.Saidi@ARM.com#endif 498