| /* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. |
| * Copyright 2009-2019 Pierre Ossman for Cendio AB |
| * |
| * This is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This software is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this software; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
| * USA. |
| */ |
| // |
| // SMsgWriter - class for writing RFB messages on the server side. |
| // |
| |
| #ifndef __RFB_SMSGWRITER_H__ |
| #define __RFB_SMSGWRITER_H__ |
| |
| #include <rdr/types.h> |
| #include <rfb/encodings.h> |
| #include <rfb/ScreenSet.h> |
| |
| namespace rdr { class OutStream; } |
| |
| namespace rfb { |
| |
| class ClientParams; |
| class PixelFormat; |
| struct ScreenSet; |
| |
| class SMsgWriter { |
| public: |
| SMsgWriter(ClientParams* client, rdr::OutStream* os); |
| virtual ~SMsgWriter(); |
| |
| // writeServerInit() must only be called at the appropriate time in the |
| // protocol initialisation. |
| void writeServerInit(rdr::U16 width, rdr::U16 height, |
| const PixelFormat& pf, const char* name); |
| |
| // Methods to write normal protocol messages |
| |
| // writeSetColourMapEntries() writes a setColourMapEntries message, using |
| // the given colour entries. |
| void writeSetColourMapEntries(int firstColour, int nColours, |
| const rdr::U16 red[], |
| const rdr::U16 green[], |
| const rdr::U16 blue[]); |
| |
| // writeBell() does the obvious thing. |
| void writeBell(); |
| |
| void writeServerCutText(const char* str); |
| |
| void writeClipboardCaps(rdr::U32 caps, const rdr::U32* lengths); |
| void writeClipboardRequest(rdr::U32 flags); |
| void writeClipboardPeek(rdr::U32 flags); |
| void writeClipboardNotify(rdr::U32 flags); |
| void writeClipboardProvide(rdr::U32 flags, const size_t* lengths, |
| const rdr::U8* const* data); |
| |
| // writeFence() sends a new fence request or response to the client. |
| void writeFence(rdr::U32 flags, unsigned len, const char data[]); |
| |
| // writeEndOfContinuousUpdates() indicates that we have left continuous |
| // updates mode. |
| void writeEndOfContinuousUpdates(); |
| |
| // writeDesktopSize() won't actually write immediately, but will |
| // write the relevant pseudo-rectangle as part of the next update. |
| void writeDesktopSize(rdr::U16 reason, rdr::U16 result=0); |
| |
| void writeSetDesktopName(); |
| |
| // Like setDesktopSize, we can't just write out a cursor message |
| // immediately. |
| void writeCursor(); |
| |
| // Same for LED state message |
| void writeLEDState(); |
| |
| // And QEMU keyboard event handshake |
| void writeQEMUKeyEvent(); |
| |
| // needFakeUpdate() returns true when an immediate update is needed in |
| // order to flush out pseudo-rectangles to the client. |
| bool needFakeUpdate(); |
| |
| // needNoDataUpdate() returns true when an update without any |
| // framebuffer changes need to be sent (using writeNoDataUpdate()). |
| // Commonly this is an update that modifies the size of the framebuffer |
| // or the screen layout. |
| bool needNoDataUpdate(); |
| |
| // writeNoDataUpdate() write a framebuffer update containing only |
| // pseudo-rectangles. |
| void writeNoDataUpdate(); |
| |
| // writeFramebufferUpdateStart() initiates an update which you can fill |
| // in using writeCopyRect() and encoders. Finishing the update by calling |
| // writeFramebufferUpdateEnd(). |
| void writeFramebufferUpdateStart(int nRects); |
| void writeFramebufferUpdateEnd(); |
| |
| // There is no explicit encoder for CopyRect rects. |
| void writeCopyRect(const Rect& r, int srcX, int srcY); |
| |
| // Encoders should call these to mark the start and stop of individual |
| // rects. |
| void startRect(const Rect& r, int enc); |
| void endRect(); |
| |
| protected: |
| void startMsg(int type); |
| void endMsg(); |
| |
| void writePseudoRects(); |
| void writeNoDataRects(); |
| |
| void writeSetDesktopSizeRect(int width, int height); |
| void writeExtendedDesktopSizeRect(rdr::U16 reason, rdr::U16 result, |
| int fb_width, int fb_height, |
| const ScreenSet& layout); |
| void writeSetDesktopNameRect(const char *name); |
| void writeSetCursorRect(int width, int height, |
| int hotspotX, int hotspotY, |
| const void* data, const void* mask); |
| void writeSetXCursorRect(int width, int height, |
| int hotspotX, int hotspotY, |
| const void* data, const void* mask); |
| void writeSetCursorWithAlphaRect(int width, int height, |
| int hotspotX, int hotspotY, |
| const rdr::U8* data); |
| void writeSetVMwareCursorRect(int width, int height, |
| int hotspotX, int hotspotY, |
| const rdr::U8* data); |
| void writeLEDStateRect(rdr::U8 state); |
| void writeQEMUKeyEventRect(); |
| |
| ClientParams* client; |
| rdr::OutStream* os; |
| |
| int nRectsInUpdate; |
| int nRectsInHeader; |
| |
| bool needSetDesktopName; |
| bool needCursor; |
| bool needLEDState; |
| bool needQEMUKeyEvent; |
| |
| typedef struct { |
| rdr::U16 reason, result; |
| } ExtendedDesktopSizeMsg; |
| |
| std::list<ExtendedDesktopSizeMsg> extendedDesktopSizeMsgs; |
| }; |
| } |
| #endif |