diff options
author | Constantin Kaplinsky <const@tightvnc.com> | 2006-05-25 05:01:55 +0000 |
---|---|---|
committer | Constantin Kaplinsky <const@tightvnc.com> | 2006-05-25 05:01:55 +0000 |
commit | a2adc8d4cfdf7336ce9192414c5e775224742a97 (patch) | |
tree | 0fc9f229bd40a2de342d91338798033da8ebd7bc /common/rfb/SMsgWriter.h | |
parent | 4fc2026b9595e9425f50616d18781995aebe495b (diff) | |
download | tigervnc-a2adc8d4cfdf7336ce9192414c5e775224742a97.tar.gz tigervnc-a2adc8d4cfdf7336ce9192414c5e775224742a97.zip |
Migrating to new directory structure adopted from the RealVNC's source tree. More changes will follow.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@589 3789f03b-4d11-0410-bbf8-ca57d06f2519
Diffstat (limited to 'common/rfb/SMsgWriter.h')
-rw-r--r-- | common/rfb/SMsgWriter.h | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/common/rfb/SMsgWriter.h b/common/rfb/SMsgWriter.h new file mode 100644 index 00000000..ed8ad0ef --- /dev/null +++ b/common/rfb/SMsgWriter.h @@ -0,0 +1,163 @@ +/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. + * + * 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/Encoder.h> + +namespace rdr { class OutStream; } + +namespace rfb { + + class PixelFormat; + class ConnParams; + class ImageGetter; + class ColourMap; + class Region; + class UpdateInfo; + + class WriteSetCursorCallback { + public: + virtual void writeSetCursorCallback() = 0; + }; + + class SMsgWriter { + public: + virtual ~SMsgWriter(); + + // writeServerInit() must only be called at the appropriate time in the + // protocol initialisation. + virtual void writeServerInit()=0; + + // Methods to write normal protocol messages + + // writeSetColourMapEntries() writes a setColourMapEntries message, using + // the given ColourMap object to lookup the RGB values of the given range + // of colours. + virtual void writeSetColourMapEntries(int firstColour, int nColours, + ColourMap* cm); + + // writeBell() and writeServerCutText() do the obvious thing. + virtual void writeBell(); + virtual void writeServerCutText(const char* str, int len); + + // setupCurrentEncoder() should be called before each framebuffer update, + // prior to calling getNumRects() or writeFramebufferUpdateStart(). + void setupCurrentEncoder(); + + // getNumRects() computes the number of sub-rectangles that will compose a + // given rectangle, for current encoder. + int getNumRects(const Rect &r); + + // writeSetDesktopSize() on a V3 writer won't actually write immediately, + // but will write the relevant pseudo-rectangle as part of the next update. + virtual bool writeSetDesktopSize()=0; + + // Like setDesktopSize, we can't just write out a setCursor message + // immediately on a V3 writer. Instead of calling writeSetCursor() + // directly, you must call cursorChange(), and then invoke writeSetCursor() + // in response to the writeSetCursorCallback() callback. For a V3 writer + // this will happen when the next update is sent. + virtual void cursorChange(WriteSetCursorCallback* cb)=0; + virtual void writeSetCursor(int width, int height, const Point& hotspot, + void* data, void* mask)=0; + virtual void writeSetXCursor(int width, int height, int hotspotX, + int hotspotY, void* data, void* mask)=0; + + // needFakeUpdate() returns true when an immediate update is needed in + // order to flush out setDesktopSize or setCursor pseudo-rectangles to the + // client. + virtual bool needFakeUpdate(); + + // writeFramebufferUpdate() writes a framebuffer update using the given + // UpdateInfo and ImageGetter. On a V3 writer this may have + // pseudo-rectangles for setDesktopSize and setCursor added to it, and so + // may invoke writeSetCursorCallback(). + virtual void writeFramebufferUpdate(const UpdateInfo& ui, ImageGetter* ig, + Region* updatedRegion); + + // writeRects() accepts an UpdateInfo (changed & copied regions) and an + // ImageGetter to fetch pixels from. It then calls writeCopyRect() and + // writeRect() as appropriate. writeFramebufferUpdateStart() must be used + // before the first writeRects() call and writeFrameBufferUpdateEnd() after + // the last one. It returns the actual region sent to the client, which + // may be smaller than the update passed in. + virtual void writeRects(const UpdateInfo& update, ImageGetter* ig, + Region* updatedRegion); + + // To construct a framebuffer update you can call + // writeFramebufferUpdateStart(), followed by a number of writeCopyRect()s + // and writeRect()s, finishing with writeFramebufferUpdateEnd(). If you + // know the exact number of rectangles ahead of time you can specify it to + // writeFramebufferUpdateStart() which can be more efficient. + virtual void writeFramebufferUpdateStart(int nRects)=0; + virtual void writeFramebufferUpdateStart()=0; + virtual void writeFramebufferUpdateEnd()=0; + + // writeRect() tries to write the given rectangle. If it is unable to + // write the whole rectangle it returns false and sets actual to the actual + // rectangle which was updated. + virtual bool writeRect(const Rect& r, ImageGetter* ig, Rect* actual); + virtual bool writeRect(const Rect& r, unsigned int encoding, + ImageGetter* ig, Rect* actual); + + virtual void writeCopyRect(const Rect& r, int srcX, int srcY); + + virtual void startRect(const Rect& r, unsigned int enc)=0; + virtual void endRect()=0; + + ConnParams* getConnParams() { return cp; } + rdr::OutStream* getOutStream() { return os; } + rdr::U8* getImageBuf(int required, int requested=0, int* nPixels=0); + int bpp(); + + int getUpdatesSent() { return updatesSent; } + int getRectsSent(int encoding) { return rectsSent[encoding]; } + int getBytesSent(int encoding) { return bytesSent[encoding]; } + int getRawBytesEquivalent() { return rawBytesEquivalent; } + + int imageBufIdealSize; + + protected: + SMsgWriter(ConnParams* cp, rdr::OutStream* os); + + virtual void startMsg(int type)=0; + virtual void endMsg()=0; + + ConnParams* cp; + rdr::OutStream* os; + + Encoder* encoders[encodingMax+1]; + int lenBeforeRect; + unsigned int currentEncoding; + int updatesSent; + int bytesSent[encodingMax+1]; + int rectsSent[encodingMax+1]; + int rawBytesEquivalent; + + rdr::U8* imageBuf; + int imageBufSize; + }; +} +#endif |