vncserver.hh revision 8229
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"
517949SAli.Saidi@ARM.com#include "base/circlebuf.hh"
527949SAli.Saidi@ARM.com#include "base/pollevent.hh"
537949SAli.Saidi@ARM.com#include "base/socket.hh"
547949SAli.Saidi@ARM.com#include "cpu/intr_control.hh"
558229Snate@binkert.org#include "params/VncServer.hh"
567949SAli.Saidi@ARM.com#include "sim/sim_object.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