diff options
Diffstat (limited to 'common/rfb')
-rw-r--r-- | common/rfb/SConnection.cxx | 41 | ||||
-rw-r--r-- | common/rfb/SMsgHandler.cxx | 8 | ||||
-rw-r--r-- | common/rfb/SMsgHandler.h | 3 | ||||
-rw-r--r-- | common/rfb/SMsgReader.cxx | 15 | ||||
-rw-r--r-- | common/rfb/SMsgReader.h | 3 | ||||
-rw-r--r-- | common/rfb/SMsgReaderV3.cxx | 2 | ||||
-rw-r--r-- | common/rfb/VNCSConnectionST.cxx | 39 | ||||
-rw-r--r-- | common/rfb/VNCSConnectionST.h | 8 | ||||
-rw-r--r-- | common/rfb/msgTypes.h | 4 |
9 files changed, 121 insertions, 2 deletions
diff --git a/common/rfb/SConnection.cxx b/common/rfb/SConnection.cxx index 9e47900e..bede90e4 100644 --- a/common/rfb/SConnection.cxx +++ b/common/rfb/SConnection.cxx @@ -19,6 +19,7 @@ #include <string.h> #include <rfb/Exception.h> #include <rfb/secTypes.h> +#include <rfb/msgTypes.h> #include <rfb/CapsList.h> #include <rfb/SMsgReaderV3.h> #include <rfb/SMsgWriterV3.h> @@ -422,14 +423,50 @@ void SConnection::clientInit(bool shared) // FIXME: Move sendInteractionCaps() to a class derived from SMsgWriterV3? void SConnection::sendInteractionCaps() { + // // Advertise support for non-standard server-to-client messages - // (this version has nothing to advertise). + // + CapsList scaps; + // File transfer: + /* FIXME: File transfers are not finished yet: + scaps.addTightExt(msgTypeFileListData, "FTS_LSDT"); + scaps.addTightExt(msgTypeFileDownloadData, "FTS_DNDT"); + scaps.addTightExt(msgTypeFileUploadCancel, "FTS_UPCN"); + scaps.addTightExt(msgTypeFileDownloadFailed, "FTS_DNFL"); + scaps.addTightExt(msgTypeFileDirSizeData, "FTS_DSDT"); + scaps.addTightExt(msgTypeFileLastRequestFailed, "FTS_RQFL"); + */ + + // Continuous updates: + /* FIXME: EndOfContinuousUpdates message is not supported yet: + scaps.addTightExt(msgTypeEndOfContinuousUpdates, "CUS_EOCU"); + */ + + // // Advertise support for non-standard client-to-server messages - // (this version has nothing to advertise). + // + CapsList ccaps; + // File transfer: + /* FIXME: File transfers are not finished yet: + ccaps.addTightExt(msgTypeFileListRequest, "FTC_LSRQ"); + ccaps.addTightExt(msgTypeFileDownloadRequest, "FTC_DNRQ"); + ccaps.addTightExt(msgTypeFileUploadRequest, "FTC_UPRQ"); + ccaps.addTightExt(msgTypeFileUploadRequest, "FTC_UPDT"); + ccaps.addTightExt(msgTypeFileDownloadCancel, "FTC_DNCN"); + ccaps.addTightExt(msgTypeFileUploadFailed, "FTC_UPFL"); + ccaps.addTightExt(msgTypeFileCreateDirRequest, "FTC_FCDR"); + ccaps.addTightExt(msgTypeFileDirSizeRequest, "FTC_DSRQ"); + ccaps.addTightExt(msgTypeFileRenameRequest, "FTC_RNRQ"); + ccaps.addTightExt(msgTypeFileDeleteRequest, "FTC_RMRQ"); + */ + + // Continuous updates: + ccaps.addTightExt(msgTypeEnableContinuousUpdates, "CUC_ENCU"); + // Advertise all supported encoding types (except raw encoding). CapsList ecaps; diff --git a/common/rfb/SMsgHandler.cxx b/common/rfb/SMsgHandler.cxx index ccc97ad0..f18a0489 100644 --- a/common/rfb/SMsgHandler.cxx +++ b/common/rfb/SMsgHandler.cxx @@ -50,3 +50,11 @@ void SMsgHandler::framebufferUpdateRequest(const Rect& r, bool incremental) void SMsgHandler::supportsLocalCursor() { } + +void SMsgHandler::enableContinuousUpdates(const Rect& r) +{ +} + +void SMsgHandler::disableContinuousUpdates() +{ +} diff --git a/common/rfb/SMsgHandler.h b/common/rfb/SMsgHandler.h index cf3377d5..ff742465 100644 --- a/common/rfb/SMsgHandler.h +++ b/common/rfb/SMsgHandler.h @@ -47,6 +47,9 @@ namespace rfb { virtual void setEncodings(int nEncodings, rdr::U32* encodings); virtual void framebufferUpdateRequest(const Rect& r, bool incremental); + virtual void enableContinuousUpdates(const Rect& r); + virtual void disableContinuousUpdates(); + // InputHandler interface // The InputHandler methods will be called for the corresponding messages. diff --git a/common/rfb/SMsgReader.cxx b/common/rfb/SMsgReader.cxx index f89e0f4f..0e57ea76 100644 --- a/common/rfb/SMsgReader.cxx +++ b/common/rfb/SMsgReader.cxx @@ -95,3 +95,18 @@ void SMsgReader::readClientCutText() is->readBytes(ca.buf, len); handler->clientCutText(ca.buf, len); } + +void SMsgReader::readEnableContinuousUpdates() +{ + bool enable = is->readU8(); + int x = is->readU16(); + int y = is->readU16(); + int w = is->readU16(); + int h = is->readU16(); + if (enable) { + handler->enableContinuousUpdates(Rect(x, y, x+w, y+h)); + } else { + handler->disableContinuousUpdates(); + } +} + diff --git a/common/rfb/SMsgReader.h b/common/rfb/SMsgReader.h index e6e40448..958c03a7 100644 --- a/common/rfb/SMsgReader.h +++ b/common/rfb/SMsgReader.h @@ -47,6 +47,9 @@ namespace rfb { virtual void readPointerEvent(); virtual void readClientCutText(); + // Read TightVNC-specific protocol messages. + virtual void readEnableContinuousUpdates(); + SMsgReader(SMsgHandler* handler, rdr::InStream* is); SMsgHandler* handler; diff --git a/common/rfb/SMsgReaderV3.cxx b/common/rfb/SMsgReaderV3.cxx index be01b5db..e9b020bb 100644 --- a/common/rfb/SMsgReaderV3.cxx +++ b/common/rfb/SMsgReaderV3.cxx @@ -61,6 +61,8 @@ void SMsgReaderV3::readMsg() case msgTypeFileRenameRequest: case msgTypeFileDeleteRequest: handler->processFTMsg(msgType); break; + case msgTypeEnableContinuousUpdates: readEnableContinuousUpdates(); break; + default: fprintf(stderr, "unknown message type %d\n", msgType); throw Exception("unknown message type"); diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx index fe60e431..bd067be2 100644 --- a/common/rfb/VNCSConnectionST.cxx +++ b/common/rfb/VNCSConnectionST.cxx @@ -35,6 +35,7 @@ VNCSConnectionST::VNCSConnectionST(VNCServerST* server_, network::Socket *s, : SConnection(server_->securityFactory, reverse), sock(s), server(server_), updates(false), image_getter(server->useEconomicTranslate), drawRenderedCursor(false), removeRenderedCursor(false), + autoUpdatesActive(false), pointerEventTime(0), accessRights(AccessDefault), startTime(time(0)), m_pFileTransfer(0) { @@ -480,6 +481,35 @@ void VNCSConnectionST::framebufferUpdateRequest(const Rect& r,bool incremental) writeFramebufferUpdate(); } +void VNCSConnectionST::enableContinuousUpdates(const Rect& r) +{ + // TightVNC-specific EnableContinuousUpdates message is very much like + // incremental FramebufferUpdateRequest. So here we copy some code from + // VNCSConnectionST::framebufferUpdateRequest(). + + if (!(accessRights & AccessView)) return; + + SConnection::framebufferUpdateRequest(r, true); + + autoUpdatesActive = true; + autoUpdatedRect = r; + + Region reqRgn(autoUpdatedRect); + requested.assign_union(reqRgn); + + writeFramebufferUpdate(); +} + +void VNCSConnectionST::disableContinuousUpdates() +{ + autoUpdatesActive = false; + autoUpdatedRect.clear(); + + writeFramebufferUpdate(); + + // FIXME: Send EndOfContinuousUpdates message. +} + void VNCSConnectionST::setInitialColourMap() { setColourMapEntries(0, 0); @@ -615,6 +645,15 @@ void VNCSConnectionST::writeFramebufferUpdate() if (drawRenderedCursor) writeRenderedCursorRect(); writer()->writeFramebufferUpdateEnd(); + resetRequestedRegion(); + } +} + +void VNCSConnectionST::resetRequestedRegion() +{ + if (autoUpdatesActive) { + requested.reset(autoUpdatedRect); + } else { requested.clear(); } } diff --git a/common/rfb/VNCSConnectionST.h b/common/rfb/VNCSConnectionST.h index a04296d3..7fe2e323 100644 --- a/common/rfb/VNCSConnectionST.h +++ b/common/rfb/VNCSConnectionST.h @@ -129,6 +129,9 @@ namespace rfb { virtual void setInitialColourMap(); virtual void supportsLocalCursor(); + virtual void enableContinuousUpdates(const Rect& r); + virtual void disableContinuousUpdates(); + // setAccessRights() allows a security package to limit the access rights // of a VNCSConnectioST to the server. These access rights are applied // such that the actual rights granted are the minimum of the server's @@ -150,6 +153,8 @@ namespace rfb { void setCursor(); void setSocketTimeouts(); + void resetRequestedRegion(); + network::Socket* sock; CharArray peerEndpoint; VNCServerST* server; @@ -159,6 +164,9 @@ namespace rfb { bool drawRenderedCursor, removeRenderedCursor; Rect renderedCursorRect; + bool autoUpdatesActive; // continuous updates enabled + Rect autoUpdatedRect; // continuously updated area + std::set<rdr::U32> pressedKeys; time_t lastEventTime; diff --git a/common/rfb/msgTypes.h b/common/rfb/msgTypes.h index f6f8d5cf..ec26adc7 100644 --- a/common/rfb/msgTypes.h +++ b/common/rfb/msgTypes.h @@ -33,6 +33,8 @@ namespace rfb { const int msgTypeFileDirSizeData = 134; const int msgTypeFileLastRequestFailed = 135; + const int msgTypeEndOfContinuousUpdates = 150; + // client to server const int msgTypeSetPixelFormat = 0; @@ -53,5 +55,7 @@ namespace rfb { const int msgTypeFileDirSizeRequest = 137; const int msgTypeFileRenameRequest = 138; const int msgTypeFileDeleteRequest = 139; + + const int msgTypeEnableContinuousUpdates = 150; } #endif |