* Paint a styled progressbar instead of our home-brown one.
[kdenetwork.git] / kget / core / speedlimiter.cpp
blobfb89899788e50584149e12003871d756ff6dc705
1 /* This file is part of the KDE project
3 Copyright (C) 2007 Manolo Valdes <nolis71cu@gmail.com>
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public
7 License as published by the Free Software Foundation; version 2
8 of the License.
9 */
11 #include "speedlimiter.h"
13 #include <kdebug.h>
15 #include <QtCore/QTimer>
16 #include <QtCore/QList>
19 KSpeedLimiter::KSpeedLimiter(unsigned long speed)
20 :m_speedLimit (speed)
24 KSpeedLimiter::~KSpeedLimiter()
28 void KSpeedLimiter::setSpeedLimit(unsigned long speed)
30 m_speedLimit = speed;
33 unsigned long KSpeedLimiter::speedLimit()
35 return m_speedLimit;
38 void KSpeedLimiter::addJob(KJob *job)
40 if(!m_speedLimit)
41 return;
42 m_JobSpeedLimiters << new KJobSpeedLimiter(job, m_speedLimit);
43 kDebug(5001) << "Limiting job:" << job << " speed to: " << m_speedLimit << endl;
47 KJobSpeedLimiter::KJobSpeedLimiter(KJob *job, unsigned long speedLimit)
49 m_bytes = job->processedAmount(KJob::Bytes);
50 m_job = job;
51 m_speedLimit = speedLimit;
52 m_channelSpeed = 0;
53 m_OnTime = 0;
54 m_OffTime = 0;
55 connect( m_job, SIGNAL(result(KJob *)), SLOT(slotResult( KJob *)));
56 m_time.start();
57 QTimer::singleShot(50, this, SLOT(slotOnTimer()));
60 KJobSpeedLimiter::~KJobSpeedLimiter()
64 void KJobSpeedLimiter::slotOnTimer()
66 qulonglong bytes = m_job->processedAmount(KJob::Bytes);
67 int expected = 1000.0 * (bytes - m_bytes) / m_speedLimit;
68 m_bytes = bytes;
69 int elapsed = m_time.restart();
71 QString status = isSuspended() ? QString("suspended") : QString("running");
72 kDebug(5001) << "Status: " << status << " expected time: " << expected << " elapsed time: " << elapsed << endl;
74 if (expected > elapsed)
76 m_OnTime = (elapsed * 4500)/expected;
77 m_OffTime = 4500 - m_OnTime;
78 suspend();
79 kDebug(5001) << "sleeping for: " << m_OffTime << " msegs." << endl;
80 QTimer::singleShot(m_OffTime, this, SLOT(slotOffTimer()));
82 else
84 kDebug(5001) << "speed below limit, checking in 500 msegs " << endl;
85 resume();
86 QTimer::singleShot(500, this, SLOT(slotOnTimer()));
90 void KJobSpeedLimiter::slotOffTimer()
92 resume();
93 m_time.restart();
94 kDebug(5001) << "resuming for: " << m_OnTime << " msegs." << endl;
95 QTimer::singleShot(m_OnTime, this, SLOT(slotOnTimer()));
98 void KJobSpeedLimiter::slotResult(KJob *job)
100 Q_UNUSED(job);
101 m_job = 0;
102 deleteLater();
105 bool KJobSpeedLimiter::isSuspended()
107 m_isSuspended = m_job->isSuspended();
108 return m_isSuspended;
111 void KJobSpeedLimiter::suspend()
113 if(!isSuspended())
114 m_job->suspend();
117 void KJobSpeedLimiter::resume()
119 if(isSuspended())
120 m_job->resume();