[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    extragear/network/kftpgrabber/src/engine
From:       Jernej Kos <kostko () unimatrix-one ! org>
Date:       2006-04-04 16:03:17
Message-ID: 1144166597.621421.27790.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 526422 by kostko:

Fixed premature transfer completion that caused incomplete file downloads in some \
cases.

 M  +37 -30    ftpsocket.cpp  
 M  +4 -0      ftpsocket.h  


--- trunk/extragear/network/kftpgrabber/src/engine/ftpsocket.cpp #526421:526422
@@ -581,7 +581,7 @@
         }
         case WaitTransfer: {
           // Transfer has been completed
-          socket()->resetCommandClass();
+          socket()->checkTransferEnd();
           break;
         }
       }
@@ -708,6 +708,23 @@
     }
 };
 
+void FtpSocket::initializeTransferSocket()
+{
+  QObject::connect(m_transferSocket, SIGNAL(connected(const KResolverEntry&)), this, \
SLOT(slotDataConnected())); +  QObject::connect(m_transferSocket, \
SIGNAL(gotError(int)), this, SLOT(slotDataError())); +  
+  m_transferEnd = 0;
+  m_transferBytes = 0;
+  m_transferBufferSize = 4096;
+  m_transferBuffer = (char*) malloc(m_transferBufferSize);
+  
+  m_speedLastTime = time(0);
+  m_speedLastBytes = 0;
+  
+  m_transferSocket->enableRead(false);
+  m_transferSocket->setBlocking(false);
+}
+
 void FtpSocket::setupPassiveTransferSocket(const QString &host, int port)
 {
   // Use the host from control connection if empty
@@ -721,18 +738,7 @@
   if (!m_transferSocket)
     m_transferSocket = new KNetwork::KStreamSocket();
     
-  QObject::connect(m_transferSocket, SIGNAL(connected(const KResolverEntry&)), this, \
                SLOT(slotDataConnected()));
-  QObject::connect(m_transferSocket, SIGNAL(gotError(int)), this, \
                SLOT(slotDataError()));
-  
-  m_transferBytes = 0;
-  m_transferBufferSize = 4096;
-  m_transferBuffer = (char*) malloc(m_transferBufferSize);
-  
-  m_speedLastTime = time(0);
-  m_speedLastBytes = 0;
-  
-  m_transferSocket->enableRead(false);
-  m_transferSocket->setBlocking(false);
+  initializeTransferSocket();
   m_transferSocket->connect(realHost, QString::number(port));
 }
 
@@ -817,18 +823,8 @@
     return;
   
   m_transferSocket = \
                static_cast<KNetwork::KStreamSocket*>(m_serverSocket->accept());
-  QObject::connect(m_transferSocket, SIGNAL(gotError(int)), this, \
SLOT(slotDataError())); +  initializeTransferSocket();
   
-  m_transferBytes = 0;
-  m_transferBufferSize = 4096;
-  m_transferBuffer = (char*) malloc(m_transferBufferSize);
-  
-  m_speedLastTime = time(0);
-  m_speedLastBytes = 0;
-  
-  m_transferSocket->enableRead(false);
-  m_transferSocket->setBlocking(false);
-  
   // Socket has been accepted so the server is not needed anymore
   m_serverSocket->deleteLater();
   m_serverSocket = 0;
@@ -872,6 +868,20 @@
   m_transferSocket = 0;
 }
 
+void FtpSocket::transferCompleted()
+{
+  // Transfer has been completed, cleanup
+  emitEvent(Event::EventMessage, i18n("Transfer completed."));
+  closeDataTransferSocket();
+  checkTransferEnd();
+}
+
+void FtpSocket::checkTransferEnd()
+{
+  if (++m_transferEnd >= 2)
+    resetCommandClass();
+}
+
 void FtpSocket::slotDataConnected()
 {
   ENGINE_ENSURE_THREAD(slotDataConnected());
@@ -893,8 +903,7 @@
     // We received an error, reset with failure
     resetCommandClass(Failed);
   } else if (m_transferSocket->error() == RemotelyDisconnected) {
-    emitEvent(Event::EventMessage, i18n("Transfer completed."));
-    closeDataTransferSocket();
+    transferCompleted();
   }
 }
 
@@ -940,8 +949,7 @@
   
   if (getTransferFile()->atEnd()) {
     // We have reached the end of file, so we should terminate the connection
-    emitEvent(Event::EventMessage, i18n("Transfer completed."));
-    closeDataTransferSocket();
+    transferCompleted();
     return;
   }
   
@@ -960,8 +968,7 @@
     // XXX this errno check is a workaround for KSSL::read that returns 0 when the
     //     read would block, but also when the connection was closed
     if (size == 0 && errno == 0) {
-      emitEvent(Event::EventMessage, i18n("Transfer completed."));
-      closeDataTransferSocket();
+      transferCompleted();
       return;
     }
   } else
--- trunk/extragear/network/kftpgrabber/src/engine/ftpsocket.h #526421:526422
@@ -98,10 +98,13 @@
     QString setupActiveTransferSocket();
     
     QFile *getTransferFile() { return &m_transferFile; }
+    void checkTransferEnd();
 protected:
     void parseLine(const QString &line);
     void variableBufferUpdate(Q_LONG size);
     void closeDataTransferSocket();
+    void initializeTransferSocket();
+    void transferCompleted();
 private:
     bool m_login;
     
@@ -116,6 +119,7 @@
     QFile m_transferFile;
     char *m_transferBuffer;
     int m_transferBufferSize;
+    int m_transferEnd;
     
     KSSL *m_controlSsl;
     KSSL *m_dataSsl;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic