18
18
#include "notificationhandler.h"
19
19
#include "preferences.h"
21
#include <config-konversation.h>
23
#ifdef HAVE_BYTESWAP_H
24
# include <byteswap.h>
25
#elif defined(HAVE_SYS_ENDIAN_H)
26
# include <sys/endian.h>
27
# define bswap_32(X) bswap32(X)
29
# if (defined(_MSC_VER) && (_MSC_VER > 1298))
31
# define bswap_32(X) _byteswap_ulong(X)
33
# define bswap_32(X) ( (((X)&0x000000FF)<<24) | (((X)&0xFF000000) >> 24) | (((X)&0x0000FF00) << 8) | (((X) &0x00FF0000) >> 8))
37
21
#include <QFileInfo>
39
23
namespace Konversation
43
Transfer::Transfer(Type dccType, QObject *parent)
27
Transfer::Transfer( Type dccType, QObject* parent )
61
45
m_currentSpeed = 0.0;
63
47
m_bufferSize = Preferences::self()->dccBufferSize();
64
m_buffer = new char[m_bufferSize];
48
m_buffer = new char[ m_bufferSize ];
66
connect(&m_loggerTimer, SIGNAL(timeout()), this, SLOT(logTransfer()));
50
connect( &m_loggerTimer, SIGNAL( timeout() ), this, SLOT( logTransfer() ) );
68
52
m_timeOffer = QDateTime::currentDateTime();
76
void Transfer::setConnectionId(int id)
60
void Transfer::setConnectionId( int id )
78
if (getStatus() == Configuring || getStatus() == Queued)
62
if ( getStatus() == Configuring || getStatus() == Queued )
80
63
m_connectionId = id;
84
void Transfer::setPartnerNick(const QString &nick)
66
void Transfer::setPartnerNick( const QString& nick )
86
if (getStatus() == Configuring || getStatus() == Queued)
68
if ( getStatus() == Configuring || getStatus() == Queued )
88
69
m_partnerNick = nick;
92
72
bool Transfer::queue()
95
if (getStatus() != Configuring)
100
if (m_fileName.isEmpty())
105
if (m_connectionId == -1 || m_partnerNick.isEmpty())
75
if ( getStatus() != Configuring )
78
if ( m_fileName.isEmpty() )
81
if ( m_connectionId == -1 || m_partnerNick.isEmpty() )
116
90
m_timeTransferStarted = QDateTime::currentDateTime();
117
91
m_loggerBaseTime.start();
118
m_loggerTimer.start(100);
92
m_loggerTimer.start( 100 );
121
95
void Transfer::finishTransferLogger()
123
if (m_timeTransferFinished.isNull())
97
if ( m_timeTransferFinished.isNull() )
125
98
m_timeTransferFinished = QDateTime::currentDateTime();
127
99
m_loggerTimer.stop();
128
100
updateTransferMeters();
131
103
// called by m_loggerTimer
132
104
void Transfer::logTransfer()
134
m_transferLogTime.append(m_loggerBaseTime.elapsed());
135
m_transferLogPosition.append(m_transferringPosition);
106
m_transferLogTime.append( m_loggerBaseTime.elapsed() );
107
m_transferLogPosition.append( m_transferringPosition );
136
108
updateTransferMeters();
152
124
// just for convenience
153
void Transfer::failed(const QString &errorMessage)
125
void Transfer::failed( const QString& errorMessage )
156
Application *konv_app = Application::instance();
157
Server *server = konv_app->getConnectionManager()->getServerByConnectionId(m_connectionId);
128
Application* konv_app = Application::instance();
129
Server* server = konv_app->getConnectionManager()->getServerByConnectionId( m_connectionId );
160
132
kDebug() << "notification:" << errorMessage;
161
133
konv_app->notificationHandler()->dccError(server->getStatusView(), errorMessage);
163
setStatus(Failed, errorMessage);
135
setStatus( Failed, errorMessage );
167
void Transfer::setStatus(Status status, const QString &statusDetail)
139
void Transfer::setStatus( Status status, const QString& statusDetail )
169
bool changed = (status != m_status);
141
bool changed = ( status != m_status );
170
142
Status oldStatus = m_status;
171
143
m_status = status;
172
144
m_statusDetail = statusDetail;
175
emit statusChanged(this, m_status, oldStatus);
147
emit statusChanged( this, m_status, oldStatus );
178
150
if (m_status == Done)
180
Application *konv_app = Application::instance();
181
Server *server = konv_app->getConnectionManager()->getServerByConnectionId(m_connectionId);
152
Application* konv_app = Application::instance();
153
Server* server = konv_app->getConnectionManager()->getServerByConnectionId( m_connectionId );
184
156
kDebug() << "notification:" << m_fileName;
192
164
const int timeToCalc = 5;
194
if (getStatus() == Transferring)
166
if ( getStatus() == Transferring )
196
168
// update CurrentSpeed
198
170
// remove too old data
199
171
QList<int>::iterator itTime = m_transferLogTime.begin();
200
172
QList<KIO::fileoffset_t>::iterator itPos = m_transferLogPosition.begin();
201
while (itTime != m_transferLogTime.end() && (m_transferLogTime.last() - (*itTime) > timeToCalc * 1000))
173
while ( itTime != m_transferLogTime.end() && ( m_transferLogTime.last() - (*itTime) > timeToCalc * 1000 ) )
203
itTime = m_transferLogTime.erase(itTime);
204
itPos = m_transferLogPosition.erase(itPos);
175
itTime = m_transferLogTime.erase( itTime );
176
itPos = m_transferLogPosition.erase( itPos );
207
179
// shift the base of the time (m_transferLoggerBaseTime)
208
180
// reason: QTime can't handle a time longer than 24 hours
209
181
int shiftOffset = m_loggerBaseTime.restart();
210
182
itTime = m_transferLogTime.begin();
211
for (; itTime != m_transferLogTime.end(); ++itTime)
183
for ( ; itTime != m_transferLogTime.end() ; ++itTime )
213
184
(*itTime) = (*itTime) - shiftOffset;
216
186
// The logTimer is 100ms, as 200ms is below 1sec we get "undefined" speed
217
if (m_transferLogTime.count() >= 2 && m_timeTransferStarted.secsTo(QDateTime::currentDateTime()) > 0)
187
if ( m_transferLogTime.count() >= 2 && m_timeTransferStarted.secsTo( QDateTime::currentDateTime()) > 0)
219
189
// FIXME: precision of average speed is too bad
220
m_averageSpeed = (double)(m_transferringPosition - m_transferStartPosition) / (double)m_timeTransferStarted.secsTo(QDateTime::currentDateTime());
221
m_currentSpeed = (double)(m_transferLogPosition.last() - m_transferLogPosition.front()) / (double)(m_transferLogTime.last() - m_transferLogTime.front()) * 1000;
190
m_averageSpeed = (double)( m_transferringPosition - m_transferStartPosition ) / (double)m_timeTransferStarted.secsTo( QDateTime::currentDateTime() );
191
m_currentSpeed = (double)( m_transferLogPosition.last() - m_transferLogPosition.front() ) / (double)( m_transferLogTime.last() - m_transferLogTime.front() ) * 1000;
223
193
else // avoid zero devision
234
else if (m_currentSpeed <= 0)
204
else if ( m_currentSpeed <= 0 )
236
206
m_timeLeft = Transfer::InfiniteValue;
240
m_timeLeft = (int)((double)(m_fileSize - m_transferringPosition) / m_currentSpeed);
210
m_timeLeft = (int)( (double)( m_fileSize - m_transferringPosition ) / m_currentSpeed );
243
else if (m_status >= Done)
213
else if ( m_status >= Done )
245
if (m_timeTransferStarted.secsTo(m_timeTransferFinished) > 1)
215
if ( m_timeTransferStarted.secsTo( m_timeTransferFinished ) > 1 )
247
m_averageSpeed = (double)(m_transferringPosition - m_transferStartPosition) / (double)m_timeTransferStarted.secsTo(m_timeTransferFinished);
217
m_averageSpeed = (double)( m_transferringPosition - m_transferStartPosition ) / (double)m_timeTransferStarted.secsTo( m_timeTransferFinished );
272
QString Transfer::sanitizeFileName(const QString &fileName)
242
QString Transfer::sanitizeFileName( const QString& fileName )
274
QString fileNameTmp = QFileInfo(fileName).fileName();
275
if (fileNameTmp.startsWith('.'))
277
fileNameTmp.replace(0, 1, '_'); // Don't create hidden files
279
if (fileNameTmp.isEmpty())
244
QString fileNameTmp = QFileInfo( fileName ).fileName();
245
if ( fileNameTmp.startsWith( '.' ) )
246
fileNameTmp.replace( 0, 1, '_' ); // Don't create hidden files
247
if ( fileNameTmp.isEmpty() )
281
248
fileNameTmp = "unnamed";
283
249
return fileNameTmp;
286
quint32 Transfer::intel(quint32 value)
252
quint32 Transfer::intel( quint32 value )
288
return bswap_32(value);
254
value = ( (value & 0xff000000) >> 24 ) +
255
( (value & 0x00ff0000) >> 8 ) +
256
( (value & 0x0000ff00) << 8 ) +
257
( (value & 0x000000ff) << 24 );
291
262
Transfer::Type Transfer::getType() const