~ubuntu-branches/ubuntu/lucid/konversation/lucid-updates

« back to all changes in this revision

Viewing changes to src/dcc/transfer.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Jonathan Thomas
  • Date: 2010-02-11 14:52:14 UTC
  • mto: This revision was merged to the branch mainline in revision 43.
  • Revision ID: james.westby@ubuntu.com-20100211145214-xsbd3hmrnu5fmb8f
Tags: upstream-1.2.2
ImportĀ upstreamĀ versionĀ 1.2.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
#include "notificationhandler.h"
19
19
#include "preferences.h"
20
20
 
21
 
#include <config-konversation.h>
22
 
 
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)
28
 
#else
29
 
#   if (defined(_MSC_VER) && (_MSC_VER > 1298))
30
 
#       include <stdlib.h>
31
 
#       define bswap_32(X) _byteswap_ulong(X)
32
 
#   else
33
 
#       define bswap_32(X) ( (((X)&0x000000FF)<<24) | (((X)&0xFF000000) >> 24) | (((X)&0x0000FF00) << 8) | (((X) &0x00FF0000) >> 8))
34
 
#   endif
35
 
#endif
36
 
 
37
21
#include <QFileInfo>
38
22
 
39
23
namespace Konversation
40
24
{
41
25
    namespace DCC
42
26
    {
43
 
        Transfer::Transfer(Type dccType, QObject *parent)
 
27
        Transfer::Transfer( Type dccType, QObject* parent )
44
28
            : QObject(parent)
45
29
        {
46
30
            kDebug();
61
45
            m_currentSpeed = 0.0;
62
46
 
63
47
            m_bufferSize = Preferences::self()->dccBufferSize();
64
 
            m_buffer = new char[m_bufferSize];
 
48
            m_buffer = new char[ m_bufferSize ];
65
49
 
66
 
            connect(&m_loggerTimer, SIGNAL(timeout()), this, SLOT(logTransfer()));
 
50
            connect( &m_loggerTimer, SIGNAL( timeout() ), this, SLOT( logTransfer() ) );
67
51
 
68
52
            m_timeOffer = QDateTime::currentDateTime();
69
53
        }
73
57
            kDebug();
74
58
        }
75
59
 
76
 
        void Transfer::setConnectionId(int id)
 
60
        void Transfer::setConnectionId( int id )
77
61
        {
78
 
            if (getStatus() == Configuring || getStatus() == Queued)
79
 
            {
 
62
            if ( getStatus() == Configuring || getStatus() == Queued )
80
63
                m_connectionId = id;
81
 
            }
82
64
        }
83
65
 
84
 
        void Transfer::setPartnerNick(const QString &nick)
 
66
        void Transfer::setPartnerNick( const QString& nick )
85
67
        {
86
 
            if (getStatus() == Configuring || getStatus() == Queued)
87
 
            {
 
68
            if ( getStatus() == Configuring || getStatus() == Queued )
88
69
                m_partnerNick = nick;
89
 
            }
90
70
        }
91
71
 
92
72
        bool Transfer::queue()
93
73
        {
94
74
            kDebug();
95
 
            if (getStatus() != Configuring)
96
 
            {
97
 
                return false;
98
 
            }
99
 
 
100
 
            if (m_fileName.isEmpty())
101
 
            {
102
 
                return false;
103
 
            }
104
 
 
105
 
            if (m_connectionId == -1 || m_partnerNick.isEmpty())
106
 
            {
107
 
                return false;
108
 
            }
109
 
 
110
 
            setStatus(Queued);
 
75
            if ( getStatus() != Configuring )
 
76
                return false;
 
77
 
 
78
            if ( m_fileName.isEmpty() )
 
79
                return false;
 
80
 
 
81
            if ( m_connectionId == -1 || m_partnerNick.isEmpty() )
 
82
                return false;
 
83
 
 
84
            setStatus( Queued );
111
85
            return true;
112
86
        }
113
87
 
115
89
        {
116
90
            m_timeTransferStarted = QDateTime::currentDateTime();
117
91
            m_loggerBaseTime.start();
118
 
            m_loggerTimer.start(100);
 
92
            m_loggerTimer.start( 100 );
119
93
        }
120
94
 
121
95
        void Transfer::finishTransferLogger()
122
96
        {
123
 
            if (m_timeTransferFinished.isNull())
124
 
            {
 
97
            if ( m_timeTransferFinished.isNull() )
125
98
                m_timeTransferFinished = QDateTime::currentDateTime();
126
 
            }
127
99
            m_loggerTimer.stop();
128
100
            updateTransferMeters();
129
101
        }
131
103
        // called by m_loggerTimer
132
104
        void Transfer::logTransfer()
133
105
        {
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();
137
109
        }
138
110
 
150
122
        }
151
123
 
152
124
        // just for convenience
153
 
        void Transfer::failed(const QString &errorMessage)
 
125
        void Transfer::failed( const QString& errorMessage )
154
126
        {
155
127
            cleanUp();
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 );
158
130
            if (server)
159
131
            {
160
132
                kDebug() << "notification:" << errorMessage;
161
133
                konv_app->notificationHandler()->dccError(server->getStatusView(), errorMessage);
162
134
            }
163
 
            setStatus(Failed, errorMessage);
164
 
            emit done(this);
 
135
            setStatus( Failed, errorMessage );
 
136
            emit done( this );
165
137
        }
166
138
 
167
 
        void Transfer::setStatus(Status status, const QString &statusDetail)
 
139
        void Transfer::setStatus( Status status, const QString& statusDetail )
168
140
        {
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;
173
 
            if (changed)
 
145
            if ( changed )
174
146
            {
175
 
                emit statusChanged(this, m_status, oldStatus);
 
147
                emit statusChanged( this, m_status, oldStatus );
176
148
            }
177
149
 
178
150
            if (m_status == Done)
179
151
            {
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 );
182
154
                if (server)
183
155
                {
184
156
                    kDebug() << "notification:" << m_fileName;
191
163
        {
192
164
            const int timeToCalc = 5;
193
165
 
194
 
            if (getStatus() == Transferring)
 
166
            if ( getStatus() == Transferring )
195
167
            {
196
168
                // update CurrentSpeed
197
169
 
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 ) )
202
174
                {
203
 
                    itTime = m_transferLogTime.erase(itTime);
204
 
                    itPos = m_transferLogPosition.erase(itPos);
 
175
                    itTime = m_transferLogTime.erase( itTime );
 
176
                    itPos = m_transferLogPosition.erase( itPos );
205
177
                }
206
178
 
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)
212
 
                {
 
183
                for ( ; itTime != m_transferLogTime.end() ; ++itTime )
213
184
                    (*itTime) = (*itTime) - shiftOffset;
214
 
                }
215
185
 
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)
218
188
                {
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;
222
192
                }
223
193
                else // avoid zero devision
224
194
                {
231
201
                {
232
202
                    m_timeLeft = 0;
233
203
                }
234
 
                else if (m_currentSpeed <= 0)
 
204
                else if ( m_currentSpeed <= 0 )
235
205
                {
236
206
                    m_timeLeft = Transfer::InfiniteValue;
237
207
                }
238
208
                else
239
209
                {
240
 
                    m_timeLeft = (int)((double)(m_fileSize - m_transferringPosition) / m_currentSpeed);
 
210
                    m_timeLeft = (int)( (double)( m_fileSize - m_transferringPosition ) / m_currentSpeed );
241
211
                }
242
212
            }
243
 
            else if (m_status >= Done)
 
213
            else if ( m_status >= Done )
244
214
            {
245
 
                if (m_timeTransferStarted.secsTo(m_timeTransferFinished) > 1)
 
215
                if ( m_timeTransferStarted.secsTo( m_timeTransferFinished ) > 1 )
246
216
                {
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 );
248
218
                }
249
219
                else
250
220
                {
269
239
            }
270
240
        }
271
241
 
272
 
        QString Transfer::sanitizeFileName(const QString &fileName)
 
242
        QString Transfer::sanitizeFileName( const QString& fileName )
273
243
        {
274
 
            QString fileNameTmp = QFileInfo(fileName).fileName();
275
 
            if (fileNameTmp.startsWith('.'))
276
 
            {
277
 
                fileNameTmp.replace(0, 1, '_');         // Don't create hidden files
278
 
            }
279
 
            if (fileNameTmp.isEmpty())
280
 
            {
 
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";
282
 
            }
283
249
            return fileNameTmp;
284
250
        }
285
251
 
286
 
        quint32 Transfer::intel(quint32 value)
 
252
        quint32 Transfer::intel( quint32 value )
287
253
        {
288
 
            return bswap_32(value);
 
254
            value = ( (value & 0xff000000) >> 24 ) +
 
255
                    ( (value & 0x00ff0000) >> 8  ) +
 
256
                    ( (value & 0x0000ff00) << 8  ) +
 
257
                    ( (value & 0x000000ff) << 24 );
 
258
 
 
259
            return value;
289
260
        }
290
261
 
291
262
        Transfer::Type Transfer::getType() const
298
269
            return m_status;
299
270
        }
300
271
 
301
 
        const QString &Transfer::getStatusDetail() const
 
272
        const QString& Transfer::getStatusDetail() const
302
273
        {
303
274
            return m_statusDetail;
304
275
        }
318
289
            return m_ownIp;
319
290
        }
320
291
 
321
 
        quint16 Transfer::getOwnPort() const
 
292
        uint Transfer::getOwnPort() const
322
293
        {
323
294
            return m_ownPort;
324
295
        }
333
304
            return m_partnerIp;
334
305
        }
335
306
 
336
 
        quint16 Transfer::getPartnerPort() const
 
307
        uint Transfer::getPartnerPort() const
337
308
        {
338
309
            return m_partnerPort;
339
310
        }
401
372
            }
402
373
            else
403
374
            {
404
 
                return (int)(((double)getTransferringPosition() / (double)getFileSize()) * 100.0);
 
375
                return (int)( ( (double)getTransferringPosition() / (double)getFileSize() ) * 100.0 );
405
376
            }
406
377
        }
407
378
 
418
389
        QString Transfer::transferFileName(const QString & fileName)
419
390
        {
420
391
            if (fileName.contains(' ') && !(fileName.startsWith('\"') && fileName.endsWith('\"')))
421
 
            {
422
392
                return '\"'+fileName+'\"';
423
 
            }
424
393
 
425
394
            return fileName;
426
395
        }