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