From e354df7172efbe25e94f1c6ae5516912dad1d114 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Fri, 20 Jul 2018 15:41:45 +0200 Subject: [server] Resize thumbs server side on mismatch The server requests the appropriate size thumbnail from the client so no bandwidth will be wasted. However, due to privacy concerns, the client might actually send a thumb that's smaller than requested, resulting in a tiny thumbnail on the server with huge gray borders. The server will now scale up the image in those cases. We'd actually also scale the image down now if it were too large, but this doesn't happen under normal circumstances. --- src/server/connectionframe/connectionframe.cpp | 41 ++++++++++++++++---------- 1 file changed, 25 insertions(+), 16 deletions(-) (limited to 'src/server/connectionframe/connectionframe.cpp') diff --git a/src/server/connectionframe/connectionframe.cpp b/src/server/connectionframe/connectionframe.cpp index fb2c96a..875e031 100644 --- a/src/server/connectionframe/connectionframe.cpp +++ b/src/server/connectionframe/connectionframe.cpp @@ -17,9 +17,9 @@ #include "connectionframe.h" #include "../mainwindow/mainwindow.h" #include "../net/client.h" -#include #include #include +#include static QString style_student( "QLabel{ background-color: #FFF; border-radius: 2px; color: black;} \ @@ -173,7 +173,7 @@ void ConnectionFrame::assignClient(Client* client) { assert(_client == NULL); connect( client, SIGNAL(disconnected()), this, SLOT(onClientDisconnected()) ); - connect( client, SIGNAL(thumbUpdated(Client*, const QPixmap&, const QByteArray&)), this, SLOT(onThumbUpdated(Client*, const QPixmap&, const QByteArray&)) ); + connect( client, SIGNAL(thumbUpdated(Client*, const QImage&)), this, SLOT(onThumbUpdated(Client*, const QImage&)) ); connect( client, SIGNAL(vncServerStateChange(Client*)), this, SLOT(updateAppearance())); connect( client, SIGNAL(vncClientStateChange(Client*)), this, SLOT(updateAppearance())); connect( client, SIGNAL(stateChanged()), this, SLOT(updateAppearance())); @@ -192,11 +192,15 @@ void ConnectionFrame::assignClient(Client* client) */ void ConnectionFrame::showDefaultThumb() { - const int width = this->width() - 6; - const int height = this->height() - 8 - _lblHostName->height() - _lblUserName->height(); - _remoteScreen = term->pixmap(width, height, QIcon::Normal, QIcon::On); - this->repaint(); - //_imgScreen->setPixmap(_remoteScreen); + _remoteScreen = term->pixmap(_desiredThumbSize, QIcon::Normal, QIcon::On).toImage(); + this->update(); +} + +void ConnectionFrame::calcDesiredThumbSize(const QSize &frameSize) +{ + const int width = frameSize.width() - 10; + const int height = frameSize.height() - 12 - _lblHostName->height() - (_lblUserName->isHidden() ? 0 : _lblUserName->height()); + _desiredThumbSize = QSize(width, height); } void ConnectionFrame::updateLabels() @@ -210,6 +214,7 @@ void ConnectionFrame::updateLabels() _lblUserName->setText(_client->name()); _lblUserName->show(); } + calcDesiredThumbSize(this->size()); } /** @@ -226,7 +231,6 @@ void ConnectionFrame::mouseReleaseEvent(QMouseEvent* event) if ((this->pos() - _previousPosition).manhattanLength() > _startDragDistance ) { emit frameMoved(this); } else { - qDebug("Clicked"); move(_previousPosition); emit clicked(this); } @@ -308,8 +312,16 @@ void ConnectionFrame::paintEvent(QPaintEvent *event) return; } + if (!_desiredThumbSize.isEmpty()) { + if (abs(100 - ((_remoteScreen.width() * 100) / _desiredThumbSize.width())) > 5 + && abs(100 - ((_remoteScreen.height() * 100) / _desiredThumbSize.height())) > 5) { + qDebug() << "Rescale thumb" << _remoteScreen.size() << "to" << _desiredThumbSize; + _remoteScreen = _remoteScreen.scaled(_desiredThumbSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); + } + } + QPainter painter(this); - painter.drawPixmap((this->width() - _remoteScreen.width()) / 2, 4, _remoteScreen); + painter.drawImage((this->width() - _remoteScreen.width()) / 2, 4, _remoteScreen); event->accept(); } @@ -324,9 +336,7 @@ void ConnectionFrame::timerEvent(QTimerEvent* /* event */ ) ++_timerCounter; if (_client->isActiveVncServer() && _timerCounter % 5 != 0) return; - const int width = this->width() - 8; - const int height = this->height() - 9 - _lblHostName->height() - _lblUserName->height(); - _client->requestThumb(width, height); + _client->requestThumb(_desiredThumbSize); } /** @@ -417,9 +427,9 @@ void ConnectionFrame::onClientDisconnected() _timerId = 0; } _client = NULL; - showDefaultThumb(); updateLabels(); updateAppearance(); + showDefaultThumb(); } /** @@ -427,11 +437,10 @@ void ConnectionFrame::onClientDisconnected() * @param client * @param thumb */ -void ConnectionFrame::onThumbUpdated(Client* client, const QPixmap& thumb, const QByteArray&) +void ConnectionFrame::onThumbUpdated(Client* client, const QImage& thumb) { assert(client == _client); _remoteScreen = thumb; - //_imgScreen->setPixmap(_remoteScreen); - this->repaint(); + this->update(); } -- cgit v1.2.3-55-g7522