From 07e44cc508133d874767204d2f96407b0b713bb5 Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Fri, 5 Oct 2018 17:32:57 +0200 Subject: [PATCH] Encapsulate setDesktopSize() in VNCServerST More encapsulation of functions that require coordinate between clients. --- common/rfb/VNCSConnectionST.cxx | 20 +-------------- common/rfb/VNCServerST.cxx | 44 ++++++++++++++++++++++++--------- common/rfb/VNCServerST.h | 6 +++-- 3 files changed, 38 insertions(+), 32 deletions(-) diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx index c83254fb..b5f81c61 100644 --- a/common/rfb/VNCSConnectionST.cxx +++ b/common/rfb/VNCSConnectionST.cxx @@ -687,27 +687,9 @@ void VNCSConnectionST::setDesktopSize(int fb_width, int fb_height, if (!(accessRights & AccessSetDesktopSize)) return; if (!rfb::Server::acceptSetDesktopSize) return; - // Don't bother the desktop with an invalid configuration - if (!layout.validate(fb_width, fb_height)) { - writer()->writeExtendedDesktopSize(reasonClient, resultInvalid, - fb_width, fb_height, layout); - return; - } - - // FIXME: the desktop will call back to VNCServerST and an extra set - // of ExtendedDesktopSize messages will be sent. This is okay - // protocol-wise, but unnecessary. - result = server->desktop->setScreenLayout(fb_width, fb_height, layout); - + result = server->setDesktopSize(this, fb_width, fb_height, layout); writer()->writeExtendedDesktopSize(reasonClient, result, fb_width, fb_height, layout); - - // Only notify other clients on success - if (result == resultSuccess) { - if (server->screenLayout != layout) - throw Exception("Desktop configured a different screen layout than requested"); - server->notifyScreenLayoutChange(this); - } } void VNCSConnectionST::fence(rdr::U32 flags, unsigned len, const char data[]) diff --git a/common/rfb/VNCServerST.cxx b/common/rfb/VNCServerST.cxx index 6affe928..31ac5d1c 100644 --- a/common/rfb/VNCServerST.cxx +++ b/common/rfb/VNCServerST.cxx @@ -513,6 +513,39 @@ void VNCServerST::clientCutText(const char* str, int len) desktop->clientCutText(str, len); } +unsigned int VNCServerST::setDesktopSize(VNCSConnectionST* requester, + int fb_width, int fb_height, + const ScreenSet& layout) +{ + unsigned int result; + std::list::iterator ci, ci_next; + + // Don't bother the desktop with an invalid configuration + if (!layout.validate(fb_width, fb_height)) + return resultInvalid; + + // FIXME: the desktop will call back to VNCServerST and an extra set + // of ExtendedDesktopSize messages will be sent. This is okay + // protocol-wise, but unnecessary. + result = desktop->setScreenLayout(fb_width, fb_height, layout); + if (result != resultSuccess) + return result; + + // Sanity check + if (screenLayout != layout) + throw Exception("Desktop configured a different screen layout than requested"); + + // Notify other clients + for (ci=clients.begin();ci!=clients.end();ci=ci_next) { + ci_next = ci; ci_next++; + if ((*ci) == requester) + continue; + (*ci)->screenLayoutChangeOrClose(reasonOtherClient); + } + + return resultSuccess; +} + // Other public methods void VNCServerST::approveConnection(network::Socket* sock, bool accept, @@ -774,17 +807,6 @@ void VNCServerST::setConnStatus(ListConnInfo* listConn) } } -void VNCServerST::notifyScreenLayoutChange(VNCSConnectionST* requester) -{ - std::list::iterator ci, ci_next; - for (ci=clients.begin();ci!=clients.end();ci=ci_next) { - ci_next = ci; ci_next++; - if ((*ci) == requester) - continue; - (*ci)->screenLayoutChangeOrClose(reasonOtherClient); - } -} - bool VNCServerST::getComparerState() { if (rfb::Server::compareFB == 0) diff --git a/common/rfb/VNCServerST.h b/common/rfb/VNCServerST.h index eff52d07..54443e1f 100644 --- a/common/rfb/VNCServerST.h +++ b/common/rfb/VNCServerST.h @@ -125,6 +125,10 @@ namespace rfb { void pointerEvent(VNCSConnectionST* client, const Point& pos, int buttonMask); void clientCutText(const char* str, int len); + unsigned int setDesktopSize(VNCSConnectionST* requester, + int fb_width, int fb_height, + const ScreenSet& layout); + // closeClients() closes all RFB sessions, except the specified one (if // any), and logs the specified reason for closure. void closeClients(const char* reason, network::Socket* sock); @@ -204,8 +208,6 @@ namespace rfb { Region getPendingRegion(); const RenderedCursor* getRenderedCursor(); - void notifyScreenLayoutChange(VNCSConnectionST *requester); - bool getComparerState(); KeyRemapper* keyRemapper; -- 2.39.5