This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository x2gokdriveclient. commit 4482061eea6ede88b57d144af536aaa772b01bbb Author: Oleksandr Shneyder <o.shneyder@phoca-gmbh.de> Date: Thu Sep 16 09:53:16 2021 +0200 reiniting of frame and cursors caches if cache is corrupted. --- client.cpp | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++------ client.h | 7 ++++++- debian/changelog | 1 + 3 files changed, 62 insertions(+), 7 deletions(-) diff --git a/client.cpp b/client.cpp index 8b0d1d2..f04d4ac 100644 --- a/client.cpp +++ b/client.cpp @@ -669,7 +669,10 @@ QPixmap Client::getPixmapFromCache(uint32_t crc) if(!frameCache.contains(crc)) { qDebug()<<"GETPIXMAP: frame"<<hex<<crc<<"not found in cache"; - exitOnError(tr("Frame not found in cache")); + if(serverVersion<5) + exitOnError(tr("Frame not found in cache")); + else + requestCacheRebuild(); return QPixmap(); } return frameCache[crc]; @@ -710,7 +713,10 @@ void Client::renderFrame() if(!frameCache.contains(reg->source_crc)) { qDebug()<<"region"<<hex<<reg->source_crc<<"not found in cache"; - exitOnError(tr("region not found in cache")); + if(serverVersion<5) + exitOnError(tr("region not found in cache")); + else + requestCacheRebuild(); return; } //qDebug()<<"REG:"<<reg->x<<reg->y<<reg->width<< reg->height<<"SOURCE:"<<reg->source_x<<reg->source_y; @@ -843,7 +849,10 @@ void Client::getCursor() if(!cursorCache.contains(currentCursor->serialNumber)) { qDebug()<<"cursor not found:"<<currentCursor->serialNumber; - exitOnError(tr("Cursor not found in cache")); + if(serverVersion<5) + exitOnError(tr("Cursor not found in cache")); + else + requestCacheRebuild(); return; } displayArea->setCursor(*cursorCache[currentCursor->serialNumber]); @@ -961,7 +970,10 @@ void Client::getDeletedCursorsList() if(!cursorCache.contains(serial)) { qDebug()<<"cursor not found in cache: "<<serial; - exitOnError(tr("cursor not found in cache")); + if(serverVersion<5) + exitOnError(tr("cursor not found in cache")); + else + requestCacheRebuild(); return; } delete cursorCache[serial]; @@ -981,7 +993,10 @@ void Client::getDeletedFramesList() if(!frameCache.contains(crc)) { qDebug()<<"DELETING: frame not found in cache: "<<hex<<crc; - exitOnError(tr("frame not found in cache")); + if(serverVersion<5) + exitOnError(tr("frame not found in cache")); + else + requestCacheRebuild(); return; } // qDebug()<<"deleting frame from cache with crc"<<hex<<crc; @@ -1097,7 +1112,10 @@ void Client::getRegionImage() fl.write((const char*)messageBuffer, currentFrame->regions.last()->dataSize); fl.close(); exit(-1);*/ - exitOnError("Image loading failed"); + if(serverVersion<5) + exitOnError("Image loading failed"); + else + requestCacheRebuild(); } if(currentFrame->numOfRegions == (uint)currentFrame->regions.size()) { @@ -1196,6 +1214,11 @@ void Client::readDataHeader() getClientSelection(); break; } + case REINIT: + { + reinitCaches(); + break; + } default: { qDebug()<<"Unsupported header type: "<<data_type; @@ -1804,3 +1827,29 @@ int Client::max_chunk() } return 10*1024*1024/4; //10MB } + +void Client::requestCacheRebuild() +{ + //sending the feature vesrion and OS version to the server + char evmsg[EVLENGTH]{}; + uint32_t etype; + etype=CACHEREBUILD; + memcpy(evmsg,(char*)&etype,4); + qDebug()<<"Requesting cache rebuild"; + sendEvent(evmsg); +} + +void Client::reinitCaches() +{ + qDebug()<<"Clearing all caches"; + cursorCache.clear(); + frameCache.clear(); + wantRepaint=false; + if(currentFrame) + delete currentFrame; + if(currentCursor) + delete currentCursor; + currentFrame=0; + currentCursor=0; + displayArea->repaint(0, 0, displayArea->width(), displayArea->height()); +} diff --git a/client.h b/client.h index 874d0e4..5adf87d 100644 --- a/client.h +++ b/client.h @@ -59,6 +59,9 @@ enum OS_VERSION{OS_LINUX, OS_WINDOWS, OS_DARWIN}; #define SELECTIONEVENT 9 #define CLIENTVERSION 10 #define DEMANDSELECTION 11 +//This event only sent by web client at the moment +#define KEEPALIVE 12 +#define CACHEREBUILD 13 #define ShiftMask (1<<0) #define LockMask (1<<1) @@ -201,13 +204,14 @@ private slots: void slotEnableRandr(); void slotResizeFSFinal(); void slotSelectionChanged(QClipboard::Mode mode); + void requestCacheRebuild(); public slots: void editWindowTitle(); private: enum{ HEADER, FRAMEREGION, REGIONDATA ,CURSORDATA, CURSORLIST, FRAMELIST, SELECTIONBUFFER } currentDataType; - enum HeaderType{ FRAME, DELETEDFRAMES, CURSOR, DELETEDCURSORS, SELECTION, SERVER_VERSION, DEMANDCLIENTSELECTION}; + enum HeaderType{ FRAME, DELETEDFRAMES, CURSOR, DELETEDCURSORS, SELECTION, SERVER_VERSION, DEMANDCLIENTSELECTION,REINIT}; void getServerversion(); void getClientSelection(); @@ -230,6 +234,7 @@ private: void setCursor(); void sendGeometryEvent(); void setFS(int screenNumber); + void reinitCaches(); bool wantRepaint=false; #ifndef Q_OS_LINUX void sendSelectionToServer(SelectionType selection); diff --git a/debian/changelog b/debian/changelog index 183140b..ad8c176 100644 --- a/debian/changelog +++ b/debian/changelog @@ -31,5 +31,6 @@ x2gokdriveclient (0.0.0.1-0x2go1) UNRELEASED; urgency=medium - support sending and recieving selections on demand. Support reading and writing INCR properties. - include xcb/xproto.h header - use zlib library to decompress compressed strings instead of built in QT function. + - reiniting of frame and cursors caches if cache is corrupted. -- Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Tue, 04 Jun 2019 11:10:43 +0200 -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2gokdriveclient.git