This is an automated email from the git hooks/post-receive script. x2go pushed a change to branch feature/udp-support in repository x2gokdriveclient. from b28603b Server to client selection in UDP mode. new d23a146 Send only frames over UDP The 1 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Summary of changes: client.cpp | 580 ++++++++++---------------------------------------------- client.h | 60 ++---- displayarea.cpp | 14 +- 3 files changed, 121 insertions(+), 533 deletions(-) -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2gokdriveclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch feature/udp-support in repository x2gokdriveclient. commit d23a146c75d43b10c8537c027c1cdd3f971df568 Author: Oleksandr Shneyder <o.shneyder@phoca-gmbh.de> Date: Tue Dec 20 09:11:24 2022 -0600 Send only frames over UDP --- client.cpp | 580 ++++++++++---------------------------------------------- client.h | 60 ++---- displayarea.cpp | 14 +- 3 files changed, 121 insertions(+), 533 deletions(-) diff --git a/client.cpp b/client.cpp index b954749..fa7f745 100644 --- a/client.cpp +++ b/client.cpp @@ -26,7 +26,6 @@ #include <QApplication> #include <QMessageBox> #include <QTimer> -#include <QTcpSocket> #include <QPainter> #include <QImage> #include <QFile> @@ -227,22 +226,22 @@ Client::Client() ((QGuiApplication*)QGuiApplication::instance())->setQuitOnLastWindowClosed(false); } - if(connectionType==TCP) - { - clientSocket=new QTcpSocket(this); - connect((QTcpSocket*)clientSocket, SIGNAL(connected()), this, SLOT(socketConnected())); - connect((QTcpSocket*)clientSocket, SIGNAL(disconnected()), this, SLOT(socketDisconnected())); - connect((QTcpSocket*)clientSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketError(QAbstractSocket::SocketError))); - connect((QTcpSocket*)clientSocket, SIGNAL(readyRead()), this, SLOT(dataArrived()) ); - } - else + clientSocket=new QTcpSocket(this); + connect(clientSocket, SIGNAL(connected()), this, SLOT(socketConnected())); + connect(clientSocket, SIGNAL(disconnected()), this, SLOT(socketDisconnected())); + connect(clientSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketError(QAbstractSocket::SocketError))); + connect(clientSocket, SIGNAL(readyRead()), this, SLOT(dataArrived()) ); + + +#warning take code for udp socket here + /* { clientSocket=new QUdpSocket(this); connect((QUdpSocket*)clientSocket, SIGNAL(connected()), this, SLOT(socketConnected())); connect((QUdpSocket*)clientSocket, SIGNAL(disconnected()), this, SLOT(socketDisconnected())); connect((QUdpSocket*)clientSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketError(QAbstractSocket::SocketError))); connect((QUdpSocket*)clientSocket, SIGNAL(readyRead()), this, SLOT(dataArrived()) ); - } + }*/ @@ -408,13 +407,13 @@ void Client::slotDisconnect() uint32_t etype; etype=DISCONNECTCLIENT; memcpy(evmsg,(char*)&etype,4); - sendEvent(evmsg,4); + sendEvent(evmsg); } - if(connectionType==TCP) - ((QTcpSocket*)clientSocket)->close(); - else - ((QUdpSocket*)clientSocket)->close(); + clientSocket->close(); + +#warning close UDPSocket + //((QUdpSocket*)clientSocket)->close(); } @@ -554,10 +553,7 @@ void Client::setFS(int screenNumber) void Client::slotSetupMenu() { - if(connectionType==TCP) - menu->setEnabled(((QTcpSocket*)clientSocket)->isOpen()); - else - menu->setEnabled(((QUdpSocket*)clientSocket)->isOpen()); + menu->setEnabled(clientSocket->isOpen()); if(useRandr) { actRandr->setChecked(true); @@ -776,16 +772,13 @@ void Client::connectToServer() { // setWindowTitle("X2GO SESSION"); - if(connectionType==TCP) - { KDRStdErr(false)<<"Connecting to remote host "<<host<<":"<<port<<" over TCP"<<KDR_ENDL; - ((QTcpSocket*)clientSocket)->connectToHost(host, port); - } - else - { + clientSocket->connectToHost(host, port); +#warning use this to open udp connection +/* { KDRStdErr(false)<<"Connecting to remote host "<<host<<":"<<port<<" over UDP"<<KDR_ENDL; ((QUdpSocket*)clientSocket)->connectToHost(host, port); - } + }*/ } @@ -934,87 +927,6 @@ void Client::setUptodate() } -void Client::processServerPacket ( QByteArray data ) -{ - uint32_t data_type=*((uint32_t*)data.constData()); - switch(data_type) - { - case DELETEDFRAMES: - { -// KDRStdErr()<<" control packet: deleted frames "<<KDR_ENDL; - getDeletedFrames(data); - break; - } - case CURSOR: - { -// KDRStdErr()<<"cursor"; - getCursor(data); - break; - } - case DELETEDCURSORS: - { -// KDRStdErr()<<"deleted cursors"; - getDeletedCursors(data); - break; - } - case SELECTION: - { -// KDRStdErr()<<"Get Selection"<<KDR_ENDL; - getSelection(data); - break; - } - case SERVER_VERSION: - { - getServerversion(data); - break; - } - case DEMANDCLIENTSELECTION: - { - KDRStdErr()<<"Get Selection demand"<<KDR_ENDL; -// getClientSelection(data); - break; - } - case REINIT: - { - reinitCaches(); - break; - } - case WINUPDATE: - { -// getWinUpdate(data); - break; - } - case SRVKEEPALIVE: - { - //synchronize with server, when using UDP - getLastProcessedEvent(data); - break; - } - case SRVDISCONNECT: - { - KDRStdErr()<<"Server sent disconnect notification"<<KDR_ENDL; - slotDisconnect(); - break; - } - case SRVSYNCFAILED: - { - KDRStdErr()<<"synchronization with server failed, requesting reinitialization"<<KDR_ENDL; - requestCacheRebuild(); - break; - } - case RESENDEVENTS: - { - resendEvents(data); - break; - } - default: - { - KDRStdErr()<<"Unsupported header type: "<<data_type<<KDR_ENDL; - break; - } - } -} - void Client::getImageFrameFromDGPacket(QByteArray data) { @@ -1109,7 +1021,7 @@ void Client::getImageFrame() -void Client::getCursorImage(char* data) +void Client::getCursorImage() { //get cursor image from buffer @@ -1117,8 +1029,6 @@ void Client::getCursorImage(char* data) // KDRStdErr()<<"got cursor image"; QCursor* cursor; - if(connectionType==UDP) - messageBuffer=data; if(currentCursor->dataSize == (uint32_t) currentCursor->width*currentCursor->height*4) { // KDRStdErr()<<"get ARGB cursor"; @@ -1130,8 +1040,7 @@ void Client::getCursorImage(char* data) cursor=new QCursor(); } cursorCache.insert(currentCursor->serialNumber, cursor); - if(connectionType==TCP) - freeMessageBuffer(); + freeMessageBuffer(); if(!rootless) displayArea->setCursor(*cursor); else @@ -1148,56 +1057,9 @@ void Client::setCursor() { } -void Client::resendEvents(QByteArray data) -{ - messageBuffer=data.data(); - uint16_t evSeq=*((uint16_t*)messageBuffer+2); - KDRStdErr()<<"Server missing event "<<evSeq<<KDR_ENDL; - if(!clientEventPackets.contains(evSeq)) - { - KDRStdErr()<<"Event "<<evSeq<<" not found!"; - requestCacheRebuild(); - } - QByteArray dgram=clientEventPackets[evSeq]; - int sent=((QUdpSocket*)clientSocket)->write(dgram); - if(sent != dgram.size()) - { - KDRStdErr()<<"Resending event dgram failed, sent "<<sent<<" from: "<<dgram.size()<<KDR_ENDL; - } -} - -void Client::getLastProcessedEvent(QByteArray data) -{ - messageBuffer=data.data(); - uint16_t lastEvSeq=*((uint16_t*)messageBuffer+2); -// KDRStdErr()<<"Server alive, last processed event "<<lastEvSeq<<KDR_ENDL; - QList<uint16_t> sequences=clientEventPackets.keys(); - uint16_t s; - int32_t current_long,last_long; - foreach(s,sequences) - { - current_long=s; - last_long=lastEvSeq; - if(abs(current_long-last_long)>64535 && (current_long<1000) ) - { - current_long+=65536; - } - - if(abs(current_long-last_long)>64535 && (last_long<1000) ) - { - last_long+=65536; - } - if(current_long<=last_long) - { - clientEventPackets.remove(s); - } - } -} -void Client::getServerversion(QByteArray data) +void Client::getServerversion() { - if(connectionType==UDP) - messageBuffer=data.data(); serverVersion=*((uint16_t*)messageBuffer+2); serverExtSelection = (serverVersion>1); @@ -1228,14 +1090,11 @@ void Client::getClientSelection() -void Client::getCursor(QByteArray data) +void Client::getCursor() { if(currentCursor) delete currentCursor; - if(connectionType==UDP) - messageBuffer=data.data(); - currentCursor=new X2GoCursor(*((uint16_t*)messageBuffer+5), *((uint16_t*)messageBuffer+6), *((uint16_t*)messageBuffer+7), *((uint16_t*)messageBuffer+8), *((uint32_t*)messageBuffer+5),*((uint32_t*)messageBuffer+6)); @@ -1267,33 +1126,23 @@ void Client::getCursor(QByteArray data) } else { - if(connectionType==UDP) - { - getCursorImage(data.data()+6*4); - } - else - { - //getCursor image - bytesReady=0; - bytesLeftToRead=currentCursor->dataSize; - currentDataType=CURSORDATA; - freeMessageBuffer(); - } + //getCursor image + bytesReady=0; + bytesLeftToRead=currentCursor->dataSize; + currentDataType=CURSORDATA; + freeMessageBuffer(); } } -void Client::getSelectionBuffer(char *data) +void Client::getSelectionBuffer() { - if(connectionType==UDP) - messageBuffer=data; #ifndef Q_OS_LINUX //if using qt class, not supporting on demand load of data setInputSelectionData(selectionClipboard, selectionFormat, firstChunk, lastChunk, compressed_size, selectionSize, messageBuffer); #else clipboard->setInputSelectionData(selectionClipboard, selectionFormat, firstChunk, lastChunk, compressed_size, selectionSize, messageBuffer); #endif - if(connectionType==TCP) - freeMessageBuffer(); + freeMessageBuffer(); } @@ -1377,15 +1226,10 @@ void Client::setInputSelectionData(SelectionType, SelectionMime mime, bool first } #endif - -void Client::getDeletedCursorsList(char* data) +void Client::getDeletedCursorsList() { //process list from messageBuffer KDRStdErr()<<"get deleted cursors: "<<deletedCursorsSize; - if(connectionType==UDP) - { - messageBuffer=data; - } for(uint i=0;i<deletedCursorsSize;++i) { uint32_t serial=*((uint32_t*)messageBuffer+i); @@ -1397,8 +1241,7 @@ void Client::getDeletedCursorsList(char* data) delete cursorCache[serial]; cursorCache.remove(serial); } - if(connectionType==TCP) - freeMessageBuffer(); + freeMessageBuffer(); } ExtWin* Client::findExtWinById(uint32_t extWinId) @@ -1619,12 +1462,9 @@ void Client::getWinUpdateBuffer() freeMessageBuffer(); } -void Client::getDeletedFramesList(char* data) +void Client::getDeletedFramesList() { //process list from messageBuffer - - if(connectionType==UDP) - messageBuffer=data; // KDRStdErr()<<"get deleted frames: "<<deletedFramesSize<<KDR_ENDL; for(uint i=0;i<deletedFramesSize;++i) { @@ -1640,8 +1480,7 @@ void Client::getDeletedFramesList(char* data) frameCache.remove(crc); } - if(connectionType==TCP) - freeMessageBuffer(); + freeMessageBuffer(); } const QList<ExtWin*> Client::getSiblings(ExtWin* win) @@ -1667,35 +1506,19 @@ void Client::getWinUpdate() freeMessageBuffer(); } -void Client::getDeletedCursors(QByteArray data) +void Client::getDeletedCursors() { //get list of deleted cursors - if(connectionType==UDP) - { - deletedCursorsSize=*((uint32_t*)data.constData()+1); - getDeletedCursorsList(data.data()+4*2); - } - else - { - deletedCursorsSize=*((uint32_t*)messageBuffer+1); - bytesReady=0; - bytesLeftToRead=deletedCursorsSize * sizeof(uint32_t); - currentDataType=CURSORLIST; - freeMessageBuffer(); - } + deletedCursorsSize=*((uint32_t*)messageBuffer+1); + bytesReady=0; + bytesLeftToRead=deletedCursorsSize * sizeof(uint32_t); + currentDataType=CURSORLIST; + freeMessageBuffer(); } -void Client::getSelection(QByteArray data) +void Client::getSelection() { - if(connectionType==UDP) - { - messageBuffer=data.data(); - bytesLeftToRead=0; - } - else - { - bytesReady=0; - } + bytesReady=0; selectionClipboard=CLIPBOARD; if( *((uint32_t*)messageBuffer+1 ) != CLIPBOARD) { @@ -1753,34 +1576,18 @@ void Client::getSelection(QByteArray data) else bytesLeftToRead=selectionSize; KDRStdErr()<<"Get Selection, is Clipboard "<<selectionClipboard<<selectionFormat<<" chunk size "<<selectionSize<<" left "<<bytesLeftToRead<<KDR_ENDL; - if(connectionType==TCP) - { - freeMessageBuffer(); - } - else - { - if(bytesLeftToRead) - getSelectionBuffer(data.data()+4*8); - } + freeMessageBuffer(); } -void Client::getDeletedFrames(QByteArray data) +void Client::getDeletedFrames() { //get list of deleted frames - if(connectionType==UDP) - { - deletedFramesSize=*((uint32_t*)data.constData()+1); - getDeletedFramesList(data.data()+2*4); - } - else - { - bytesReady=0; - deletedFramesSize=*((uint32_t*)messageBuffer+1); - bytesLeftToRead=deletedFramesSize * sizeof(uint32_t); - currentDataType=FRAMELIST; - freeMessageBuffer(); - } + bytesReady=0; + deletedFramesSize=*((uint32_t*)messageBuffer+1); + bytesLeftToRead=deletedFramesSize * sizeof(uint32_t); + currentDataType=FRAMELIST; + freeMessageBuffer(); } @@ -1915,6 +1722,17 @@ void Client::readDataHeader() getWinUpdate(); break; } + case SRVKEEPALIVE: + { + //keepalive packet, do nothing + break; + } + case SRVDISCONNECT: + { + KDRStdErr()<<"Server sent disconnect notification"<<KDR_ENDL; + slotDisconnect(); + break; + } default: { KDRStdErr()<<"Unsupported header type: "<<data_type; @@ -1984,21 +1802,11 @@ void Client::readDgram() stringType="Server frame packet"; list=&serverFramePackets; break; - case ServerControlPacket: - lastSeq=serverControlSeq; - stringType="Server control packet"; - list=&serverControlPackets; - break; case ServerRepaintPacket: lastSeq=serverRepaintSeq; stringType="Server repaint packet"; list=&serverRepaintPackets; break; - default: - //sync packet, process imediately - data.remove(0,SRVDGRAMHEADERSIZE); - processServerPacket(data); - return; } //this is for the case when the seq is going over the max of the uint16 //don't think we can lose more than 1k Packets @@ -2016,7 +1824,7 @@ void Client::readDgram() if(current_long<=last_long) { - KDRStdErr()<<"Late "<<stringType<<" arrived: "<<packSeq<<" current: "<<serverControlSeq<<KDR_ENDL; + KDRStdErr()<<"Late "<<stringType<<" arrived: "<<packSeq<<" last: "<<lastSeq<<KDR_ENDL; return; } int packetInd=findPacket(list, packSeq); @@ -2037,139 +1845,25 @@ void Client::readDgram() if(packet->addDgram(data)) { // KDRStdErr()<<"packet "<<packSeq<<" ready"<<KDR_ENDL; - if(dgtype==ServerControlPacket) - { - checkPacketsIntegrity(dgtype, packSeq); - } + if(dgtype==ServerFramePacket) + serverFrameSeq=packSeq; else + serverRepaintSeq=packSeq; + getImageFrameFromDGPacket(packet->getData()); + //delete all broken or processed packets + while(!list->isEmpty()) { - if(dgtype==ServerFramePacket) - serverFrameSeq=packSeq; - else - serverRepaintSeq=packSeq; - getImageFrameFromDGPacket(packet->getData()); - //delete all broken or processed packets - while(!list->isEmpty()) + DgramPacket* first=list->takeFirst(); + if(first==packet) { - DgramPacket* first=list->takeFirst(); - if(first==packet) - { - delete first; - break; - } delete first; + break; } + delete first; } } } -bool Client::checkPacketsIntegrity(uint , uint16_t processedSeq) -{ - QList<DgramPacket*> *list; - uint16_t *lastSeq; - QString st; - uint32_t evtype; - QMap<uint16_t, int> *resendMap; - - list=&serverControlPackets; - lastSeq=&serverControlSeq; - resendMap=&requestedControlResend; - st="Control"; - evtype=RESENDSCONTROL; - uint16_t s=*lastSeq+1; - uint16_t amountOfMissedDgramsInPacket; - bool res=true; - QByteArray missingDgrams; - - while(true) - { - int ind=findPacket(list,s); - if(ind==-1 || !list->at(ind)->isComplete()) - { - //all packet or some datagrams are missed - res=false; - //check if we didn't already request this packet for resend - int msec=QTime::currentTime().msecsSinceStartOfDay(); - if(resendMap->contains(s)) - { -// KDRStdErr()<<"Missing "<<st<<" packet "<<s<<" was requesting at "<<(*resendMap)[s]<<" now is: "<<msec<<KDR_ENDL; - if(((*resendMap)[s]+200 )> msec) - { - //we already requested resend of this packet -// KDRStdErr()<<"Already requested missing "<<st<<" packet "<<s<<KDR_ENDL; - goto loop_fin; - } - else - { - KDRStdErr()<<"Still missing "<<st<<" packet "<<s<<" requesting again"<<KDR_ENDL; - } - } - //add request to the map - (*resendMap)[s]=msec; - } - if(ind==-1) - { - res=false; - //all dgrams in packet are missed - KDRStdErr()<<"Missing "<<st<<" packet "<<s<<" processing: "<<processedSeq<<KDR_ENDL; - amountOfMissedDgramsInPacket=0; - missingDgrams.append((const char*) &s, 2); - missingDgrams.append((const char*) &amountOfMissedDgramsInPacket, 2); - } - else - { - if(!list->at(ind)->isComplete()) - { - res=false; - QVector<uint16_t> dgramSeq=list->at(ind)->getMissingDatagrams(); - //request only dgrams from packet which are missedin packet - amountOfMissedDgramsInPacket=dgramSeq.size(); - KDRStdErr()<<"Not complete "<<st<<" packet "<<s<<" missing "<<amountOfMissedDgramsInPacket<<" from "<<list->at(ind)->getNumberOfDatagrams()<<KDR_ENDL; - missingDgrams.append((const char*) &s, 2); - missingDgrams.append((const char*) &amountOfMissedDgramsInPacket, 2); - uint16_t seq; - //copy numbers of dgrams from packet which are missed - foreach(seq,dgramSeq) - { - missingDgrams.append((const char*) &seq, 2); - } - } - else - { - //the packet is complete and all packets till now are in tact - if(res) - { - *lastSeq=s; - processServerPacket(list->at(ind)->getData()); - //if packet was requested for resend, delete it from resend map - if(resendMap->contains(s)) - { - resendMap->remove(s); - } - //delete packet from list - delete list->takeAt(ind); - } - } - } -loop_fin: - if(s==processedSeq) - break; - ++s; - } - int sent=0; - //max we can send in one dgram=max dgram size - client dgram header - event type - int maxAmountOfBytes=UDPDGRAMSIZE-CLDGRAMHEADERSIZE-4; - while(sent<missingDgrams.size()) - { - int bytesToSend=(missingDgrams.size()-sent < maxAmountOfBytes)?(missingDgrams.size()-sent):maxAmountOfBytes; - QByteArray msg(4+bytesToSend, 0); - msg.insert(0,(char*)&evtype,4); - msg.insert(4, missingDgrams.constData()+sent, bytesToSend); - sendEvent(msg.data(),4+bytesToSend); - sent+=bytesToSend; - } - return res; -} void Client::slotSynchronize() { @@ -2185,22 +1879,18 @@ void Client::slotSynchronize() uint32_t etype; etype=KEEPALIVE; memcpy(evmsg,(char*)&etype,4); - if(connectionType==UDP) - { - //only sending synchronization information when connected over UDP - memcpy(evmsg+4,(char*)&serverControlSeq,2); - } - sendEvent(evmsg,8); + sendEvent(evmsg); } void Client::dataArrived() { - if(connectionType==UDP) +#warning use for udp +/* if(connectionType==UDP) { while(((QUdpSocket*)clientSocket)->hasPendingDatagrams()) readDgram(); return; - } + }*/ updateServerAlive(); // KDRStdErr()<<"Have available:"<<clientSocket->bytesAvailable(); if(!bytesLeftToRead) @@ -2217,7 +1907,7 @@ void Client::dataArrived() } // KDRStdErr()<<"trying to read bytes:"<<bytesLeftToRead; int length; - length=((QTcpSocket*)clientSocket)->read(messageBuffer+bytesReady, bytesLeftToRead); + length=clientSocket->read(messageBuffer+bytesReady, bytesLeftToRead); bytesLeftToRead-=length; bytesReady+=length; @@ -2280,16 +1970,13 @@ void Client::dataArrived() } } - if(connectionType==TCP) - { - if(((QTcpSocket*)clientSocket)->bytesAvailable()) + if(clientSocket->bytesAvailable()) dataArrived(); - } - else - { +#warning use for udp +/* { if(((QUdpSocket*)clientSocket)->bytesAvailable()) dataArrived(); - } + }*/ } @@ -2308,10 +1995,7 @@ void Client::socketConnected() } KDRStdErr()<<"Sending Cookie to server"<<KDR_ENDL; int ln; - if(connectionType==TCP) - ln=((QTcpSocket*)clientSocket)->write(cookie.toLatin1().data(), 32); - else - ln=((QUdpSocket*)clientSocket)->write(cookie.toLatin1().data(), 32); + ln=clientSocket->write(cookie.toLatin1().data(), 32); if(ln!=32) { KDRStdErr(false)<<"Failed to send auth cookie to server"<<KDR_ENDL; @@ -2321,19 +2005,6 @@ void Client::socketConnected() else { KDRStdErr(false)<<"Not sending cookie to server"<<KDR_ENDL; - if(connectionType==UDP) - { - //if we don't have cookie, we need to send something to server to initiate connection - if(((QUdpSocket*)clientSocket)->write("trying UDP connection", strlen("trying UDP connection"))!=strlen("trying UDP connection")) - { - KDRStdErr(false)<<"Failed to initiate UDP connection"<<KDR_ENDL; - exitOnError(tr("Failed to initiate UDP connection")); - } - else - { - KDRStdErr()<<"handshake done"<<KDR_ENDL; - } - } } connected=true; @@ -2342,7 +2013,7 @@ void Client::socketConnected() sendClientVersion(); QTimer::singleShot(2000, this, SLOT(checkServerVersion())); //if connected over tcp, sending synchronization packages. In other case, just sending KEEPALIVE packets - if(connectionType==UDP || serverVersion >=8) + if( serverVersion >=8) { QTimer* t=new QTimer(this); connect(t, SIGNAL(timeout()), this, SLOT(slotSynchronize())); @@ -2394,10 +2065,7 @@ void Client::socketDisconnected() void Client::socketError(QAbstractSocket::SocketError ) { QString errStr; - if(connectionType==TCP) - errStr=((QTcpSocket*)clientSocket)->errorString(); - else - errStr=((QUdpSocket*)clientSocket)->errorString(); + errStr=clientSocket->errorString(); KDRStdErr(false)<<errStr<<KDR_ENDL; exitOnError(errStr); } @@ -2412,35 +2080,14 @@ void Client::exitOnError(const QString& message) QApplication::exit(-1); } -void Client::sendEvent(char* event, uint16_t length) +void Client::sendEvent(char* event) { if(!connected) return; int ln; - if(connectionType==TCP) - { - if(!((QTcpSocket*)clientSocket)->isOpen()) - return; - ln=((QTcpSocket*)clientSocket)->write(event, EVLENGTH); - } - else - { - QByteArray data(event,length); - switch(*((uint32_t*)data.constData())) - { - case CLIENTVERSION: - case KEEPALIVE: - case RESENDSCONTROL: - case DISCONNECTCLIENT: - case CLIENTSYNCFAILED: - case RESENDFRAME: - sendDgram(data, ClientSyncPacket); - break; - default: - sendDgram(data, ClientEventPacket); - } + if(!clientSocket->isOpen()) return; - } + ln=clientSocket->write(event, EVLENGTH); if(ln!=EVLENGTH) { @@ -2449,36 +2096,6 @@ void Client::sendEvent(char* event, uint16_t length) } } -void Client::sendDgram ( QByteArray dgram, uint8_t dgtype ) -{ - if(!connected) - return; - if(!((QUdpSocket*)clientSocket)->isOpen()) - return; - dgram.prepend(QByteArray(CLDGRAMHEADERSIZE, (char)0)); - if(dgtype==ClientEventPacket) - { - *((uint16_t*)dgram.data()+2)=clientEventSeq; - } - else - { - *((uint16_t*)dgram.data()+2)=0; - } - *((uint8_t*)dgram.data()+6)=dgtype; - uint32_t checksum=crc32(0L, Z_NULL, 0); - checksum=crc32(checksum,(const unsigned char*)dgram.constData(),dgram.size()); - //setting checksum - *((uint32_t*)dgram.data())=checksum; - int sent=((QUdpSocket*)clientSocket)->write(dgram); - if(sent != dgram.size()) - { - KDRStdErr()<<"Sending dgram failed, sent "<<sent<<" from: "<<dgram.size()<<KDR_ENDL; - } - if(dgtype==ClientEventPacket) - { - clientEventPackets.insert(clientEventSeq++,dgram); - } -} void Client::moveEvent(QMoveEvent* ) { @@ -2565,7 +2182,7 @@ void Client::sendGeometryEvent() KDRStdErr()<<"not supporting more then 4 displays yet, not sending this display to server"; } } - sendEvent(evmsg, EVLENGTH); + sendEvent(evmsg); } @@ -2588,7 +2205,7 @@ void Client::sendClientVersion() memcpy(evmsg+4,(char*)&version,2); memcpy(evmsg+6,(char*)&os,2); KDRStdErr(false)<<"Sending version: "<<version<<" OS: "<<os<<KDR_ENDL; - sendEvent(evmsg,8); + sendEvent(evmsg); } @@ -2615,7 +2232,7 @@ void Client::changeWindow(ExtWin* win, uint8_t newState) memcpy(evmsg+18,(char*)&h,2); memcpy(evmsg+20,(char*)&focus,1); memcpy(evmsg+21,(char*)&newState,1); - sendEvent(evmsg,22); + sendEvent(evmsg); // QTimer::singleShot(1,win,SLOT(update())); } @@ -2631,7 +2248,7 @@ void Client::requestSelectionFromServer(SelectionType sel) KDRStdErr()<<"Requesting selection from server"<<KDR_ENDL; memcpy(evmsg,(char*)&etype,4); memcpy(evmsg+4,(char*)&selection,2); - sendEvent(evmsg,6); + sendEvent(evmsg); } @@ -2867,8 +2484,6 @@ void Client::sendOutputSelChunk() { //sending the first chunk from output selection queue -#warning implement for udp - return; if(outputSelectionQueue.isEmpty()) return; @@ -2931,13 +2546,13 @@ void Client::sendOutputSelChunk() uint32_t sentData=(size < EVLENGTH-headerSize)?size:EVLENGTH-headerSize; memcpy(evmsg+headerSize,data_ptr,sentData); - sendEvent(evmsg, EVLENGTH); + sendEvent(evmsg); while(sentData<size) { int msg_length=(size-sentData < EVLENGTH)?size-sentData:EVLENGTH; memcpy(evmsg, data_ptr+sentData, msg_length); sentData+=msg_length; - sendEvent(evmsg,EVLENGTH); + sendEvent(evmsg); } // KDRStdErr()<<"sent: "<<sentData<<"from"<<size; delete chunk; @@ -2965,7 +2580,7 @@ void Client::requestCacheRebuild() etype=CACHEREBUILD; memcpy(evmsg,(char*)&etype,4); KDRStdErr(false)<<"Requesting cache rebuild"<<KDR_ENDL; - sendEvent(evmsg,4); + sendEvent(evmsg); } void Client::requestFrame(uint32_t crc) @@ -2975,7 +2590,7 @@ void Client::requestFrame(uint32_t crc) etype=RESENDFRAME; memcpy(evmsg,(char*)&etype,4); memcpy(evmsg+4,(char*)&crc,4); - sendEvent(evmsg,8); + sendEvent(evmsg); } @@ -2993,13 +2608,8 @@ void Client::reinitCaches() currentCursor=0; if(!rootless) displayArea->repaint(0, 0, displayArea->width(), displayArea->height()); - serverControlPackets.clear(); serverFramePackets.clear(); serverRepaintPackets.clear(); - clientEventPackets.clear(); - requestedControlResend.clear(); - serverControlSeq=serverFrameSeq=serverRepaintSeq=0-1; - clientEventSeq=0; KDRStdErr(false)<<"Done"<<KDR_ENDL; } diff --git a/client.h b/client.h index 4e75c40..33ee7d1 100644 --- a/client.h +++ b/client.h @@ -66,14 +66,13 @@ enum OS_VERSION{OS_LINUX, OS_WINDOWS, OS_DARWIN}; #define KEEPALIVE 12 #define CACHEREBUILD 13 #define WINCHANGE 14 -//resend missing server control dgrams -#define RESENDSCONTROL 15 //client is going to disconnect -#define DISCONNECTCLIENT 16 -//synchronization with client has failed -#define CLIENTSYNCFAILED 17 +#define DISCONNECTCLIENT 15 //ask to resend particular frame -#define RESENDFRAME 18 +#define RESENDFRAME 16 +//client is requesting UDP port for frames +#define OPENUDP 17 + #define ShiftMask (1<<0) #define LockMask (1<<1) @@ -98,8 +97,6 @@ enum OS_VERSION{OS_LINUX, OS_WINDOWS, OS_DARWIN}; //UDP Server DGRAM Header - 4B checksum + 2B packet seq number + 2B amount of datagrams + 2B datagram seq number + 1B type #define SRVDGRAMHEADERSIZE (4+2+2+2+1) -//UDP Client DGRAM Header - 4B checksum + 2B packet seq number + 1B type -#define CLDGRAMHEADERSIZE (4+2+1) //check if server is alive every 30 seconds #define SERVERALIVETIMEOUT 30//sec @@ -107,14 +104,7 @@ enum OS_VERSION{OS_LINUX, OS_WINDOWS, OS_DARWIN}; //Types for UDP datagrams enum ServerDgramType{ ServerFramePacket, //dgram belongs to packet representing frame - ServerControlPacket, //dgram belongs to packet which couldn't be missed, but doesn't need to be processed in the real time ServerRepaintPacket, // dgram belongs to packet with screen repaint and the loss can be ignored - ServerSyncPacket //dgram belongs to packet with sync request, highest priority -}; - -enum ClientDgramType{ - ClientEventPacket, //Event packet, high priority - ClientSyncPacket //Packet with synchronization data }; enum SelectionMime{STRING,UTF_STRING,PIXMAP}; @@ -221,6 +211,7 @@ class QAction; class QLabel; class ScreenIdentifier; class ExtWin; +class QTcpSocket; class Client : public QMainWindow { @@ -228,7 +219,7 @@ class Client : public QMainWindow public: Client(); ~Client(); - void sendEvent(char *event, uint16_t length); + void sendEvent(char *event); Frame* getCurrentFrame(){return currentFrame;} bool needUpdate(){return wantRepaint;} void setUptodate(); @@ -293,30 +284,24 @@ public slots: private: enum{ HEADER, FRAMEREGION, REGIONDATA ,CURSORDATA, CURSORLIST, FRAMELIST, SELECTIONBUFFER, WINUPDATEBUFFER } currentDataType; enum HeaderType{ FRAME, DELETEDFRAMES, CURSOR, DELETEDCURSORS, SELECTION, SERVER_VERSION, DEMANDCLIENTSELECTION, - REINIT, WINUPDATE, SRVKEEPALIVE, SRVDISCONNECT, SRVSYNCFAILED, RESENDEVENTS, CACHEFRAME}; -#warning set default to TCP - enum {TCP, UDP} connectionType=UDP; - - void resendEvents(QByteArray data); - void getServerversion(QByteArray data=QByteArray()); - void getLastProcessedEvent(QByteArray data); + REINIT, WINUPDATE, SRVKEEPALIVE, SRVDISCONNECT, CACHEFRAME, UDPOPEN, UDPFAILED}; + void getServerversion(); void getClientSelection(); void setUseRandr(bool use); void exitOnError(const QString& message); void getImageFrame(); void getImageFrameFromDGPacket(QByteArray data); - void processServerPacket(QByteArray data); void readDataHeader(); void getFrameRegion(); void getRegionImage(); - void getCursor(QByteArray data=QByteArray()); - void getCursorImage(char* data=NULL); - void getDeletedFrames(QByteArray data=QByteArray()); - void getDeletedCursors(QByteArray data=QByteArray()); - void getDeletedFramesList(char* data=NULL); - void getDeletedCursorsList(char* data=NULL); - void getSelection(QByteArray data=QByteArray()); - void getSelectionBuffer(char* data=NULL); + void getCursor(); + void getCursorImage(); + void getDeletedFrames(); + void getDeletedCursors(); + void getDeletedFramesList(); + void getDeletedCursorsList(); + void getSelection(); + void getSelectionBuffer(); void getWinUpdate(); void getWinUpdateBuffer(); void renderFrame(); @@ -328,9 +313,7 @@ private: void initGeometry(); void readDgram(); void requestFrame(uint32_t crc); - void sendDgram(QByteArray dgram, uint8_t dgtype); int findPacket(QList<DgramPacket*>* list, uint16_t seq); - bool checkPacketsIntegrity(uint dgramType, uint16_t processedSeq); void updateServerAlive(); bool wantRepaint=false; bool hasUpdates=false; @@ -386,7 +369,7 @@ private: QPoint savedPosition; Qt::WindowFlags savedFlags; - void* clientSocket=0l; + QTcpSocket* clientSocket=0l; int bytesLeftToRead=0; int bytesReady=0; char* messageBuffer=0l; @@ -420,14 +403,9 @@ private: QHash <uint32_t, QCursor*> cursorCache; QList <OutputChunk*> outputSelectionQueue; QList <ExtWin*> extWindows; - QList <DgramPacket*> serverControlPackets, serverFramePackets, serverRepaintPackets; - QMap <uint16_t, int> requestedControlResend; - QMap <uint16_t, QByteArray> clientEventPackets; - uint16_t clientEventSeq=0; + QList <DgramPacket*> serverFramePackets, serverRepaintPackets; //last succesfully processed frame packet sequence uint16_t serverFrameSeq=0-1; - //last succesfully processed control packet sequence - uint16_t serverControlSeq=0-1; //last succesfully processed repaint packet sequence uint16_t serverRepaintSeq=0-1; diff --git a/displayarea.cpp b/displayarea.cpp index 9bd5a8d..d60d7ed 100644 --- a/displayarea.cpp +++ b/displayarea.cpp @@ -250,7 +250,7 @@ void DisplayArea::mouseMoveEvent(QMouseEvent* event) memcpy(evmsg+4,(char*)&x,4); memcpy(evmsg+8,(char*)&y,4); - client->sendEvent(evmsg,12); + client->sendEvent(evmsg); // Client::KDRStdErr()<<"mouse move"<<event->x()<<event->y(); @@ -270,7 +270,7 @@ void DisplayArea::mousePressEvent(QMouseEvent* event) memcpy(evmsg+4,(char*)&state,4); memcpy(evmsg+8,(char*)&button,4); - client->sendEvent(evmsg,12); + client->sendEvent(evmsg); // Client::KDRStdErr()<<"mouse press"<<event->button()<<event->buttons()<<button<<state; } @@ -289,7 +289,7 @@ void DisplayArea::mouseReleaseEvent(QMouseEvent* event) memcpy(evmsg+4,(char*)&state,4); memcpy(evmsg+8,(char*)&button,4); - client->sendEvent(evmsg,12); + client->sendEvent(evmsg); // Client::KDRStdErr()<<"mouse release"<<event->button()<<event->buttons()<<button<<state; } @@ -318,7 +318,7 @@ void DisplayArea::wheelEvent(QWheelEvent* event) memcpy(evmsg+8,(char*)&button,4); // Client::KDRStdErr()<<etype<<state<<button; - client->sendEvent(evmsg,12); + client->sendEvent(evmsg); etype=MOUSERELEASE; state=X11MouseButtonsState(event->buttons()); @@ -339,7 +339,7 @@ void DisplayArea::wheelEvent(QWheelEvent* event) memcpy(evmsg+8,(char*)&button,4); // Client::KDRStdErr()<<etype<<state<<button; - client->sendEvent(evmsg,12); + client->sendEvent(evmsg); } /* @@ -388,7 +388,7 @@ void DisplayArea::keyPressEvent(QKeyEvent* event) memcpy(evmsg,(char*)&etype,4); memcpy(evmsg+4,(char*)&state,4); memcpy(evmsg+8,(char*)&key,4); - client->sendEvent(evmsg,12); + client->sendEvent(evmsg); } void DisplayArea::keyReleaseEvent(QKeyEvent* event) @@ -412,7 +412,7 @@ void DisplayArea::keyReleaseEvent(QKeyEvent* event) memcpy(evmsg+4,(char*)&state,4); memcpy(evmsg+8,(char*)&key,4); - client->sendEvent(evmsg,12); + client->sendEvent(evmsg); } uint32_t DisplayArea::qtModifiers2pc105(Qt::KeyboardModifiers qtModifiers) -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2gokdriveclient.git