[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