[X2Go-Commits] [x2gokdriveclient] 01/01: Send only frames over UDP
git-admin at x2go.org
git-admin at x2go.org
Tue Dec 20 16:11:34 CET 2022
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 at 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
More information about the x2go-commits
mailing list