[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