1 /* This file is part of the KDE project
3 Copyright (C) 2008 Lukas Appelhans <l.appelhans@gmx.de>
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; either
8 version 2 of the License, or (at your option) any later version.
10 #include "transfergroupscheduler.h"
13 #include "transfergrouphandler.h"
16 TransferGroupScheduler::TransferGroupScheduler()
23 TransferGroupScheduler::~TransferGroupScheduler()
27 void TransferGroupScheduler::jobQueueChangedEvent(JobQueue
* queue
, JobQueue::Status status
)
29 Scheduler::jobQueueChangedEvent(queue
, status
);
32 void TransferGroupScheduler::jobQueueMovedJobEvent(JobQueue
* queue
, Job
* job
)
34 Scheduler::jobQueueMovedJobEvent(queue
, job
);
37 void TransferGroupScheduler::jobQueueAddedJobEvent(JobQueue
* queue
, Job
* job
)
39 Scheduler::jobQueueAddedJobEvent(queue
, job
);
42 void TransferGroupScheduler::jobQueueRemovedJobEvent(JobQueue
* queue
, Job
* job
)
44 Scheduler::jobQueueRemovedJobEvent(queue
, job
);
47 void TransferGroupScheduler::jobChangedEvent(Job
* job
, Job::Status status
)
49 Scheduler::jobChangedEvent(job
, status
);
52 void TransferGroupScheduler::jobChangedEvent(Job
* job
, Job::Policy status
)
54 Scheduler::jobChangedEvent(job
, status
);
57 void TransferGroupScheduler::calculateSpeedLimits()
59 calculateDownloadLimit();
60 calculateUploadLimit();
63 void TransferGroupScheduler::calculateDownloadLimit()
65 int n
= KGet::allTransferGroups().count();
66 int pool
= 0;//We create a pool where we have some KiB/s to go to other groups...
67 QList
<TransferGroupHandler
*> transfergroupsNeedSpeed
;
68 foreach (TransferGroupHandler
*handler
, KGet::allTransferGroups())
70 if (!Settings::speedLimit())
71 handler
->setDownloadLimit(0, Transfer::InvisibleSpeedLimit
);
72 else if (handler
->transfers().count() < 1)
74 pool
= pool
+ downloadLimit() / n
;
76 else if (downloadLimit() == 0 && handler
->downloadLimit(Transfer::VisibleSpeedLimit
) != 0)
78 else if (downloadLimit() == 0 && handler
->downloadLimit(Transfer::VisibleSpeedLimit
) == 0)
79 handler
->setDownloadLimit(0, Transfer::InvisibleSpeedLimit
);
80 else if (handler
->downloadLimit(Transfer::VisibleSpeedLimit
) < downloadLimit() / n
81 && handler
->downloadLimit(Transfer::VisibleSpeedLimit
) != 0)
82 /*If the handler's visible download limit is under the new one,
83 we move the KiB/s which are different to the pool*/
84 pool
= pool
+ (downloadLimit() / n
- handler
->downloadLimit(Transfer::VisibleSpeedLimit
));
85 else if (handler
->downloadSpeed() + 10 < downloadLimit() / n
)
87 /*When the downloadSpeed of the handler is under the new downloadLimit + 10 then we
88 set the downloadLimit to the downloadSpeed + 10*/
89 pool
= pool
+ downloadLimit() / n
- handler
->downloadSpeed() + 10;
90 handler
->setDownloadLimit(handler
->downloadSpeed() + 10, Transfer::InvisibleSpeedLimit
);
94 handler
->setDownloadLimit(downloadLimit() / n
, Transfer::InvisibleSpeedLimit
);
95 transfergroupsNeedSpeed
.append(handler
);
98 foreach (TransferGroupHandler
*handler
, transfergroupsNeedSpeed
)
100 handler
->setDownloadLimit(downloadLimit() / n
+ pool
/ transfergroupsNeedSpeed
.count(), Transfer::InvisibleSpeedLimit
);
104 void TransferGroupScheduler::calculateUploadLimit()
106 int n
= KGet::allTransferGroups().count();
108 int pool
= 0;//We create a pool where we have some KiB/s to go to other groups...
109 QList
<TransferGroupHandler
*> transfergroupsNeedSpeed
;
110 foreach (TransferGroupHandler
*handler
, KGet::allTransferGroups())
112 if (!Settings::speedLimit())
113 handler
->setUploadLimit(0, Transfer::InvisibleSpeedLimit
);
114 else if (handler
->transfers().count() < 1)
115 pool
= pool
+ uploadLimit() / n
;
116 else if (uploadLimit() == 0 && handler
->uploadLimit(Transfer::VisibleSpeedLimit
) != 0)
118 else if (uploadLimit() == 0 && handler
->uploadLimit(Transfer::VisibleSpeedLimit
) == 0)
119 handler
->setUploadLimit(0, Transfer::InvisibleSpeedLimit
);
120 else if (handler
->uploadLimit(Transfer::VisibleSpeedLimit
) < uploadLimit() / n
&& handler
->uploadLimit(Transfer::VisibleSpeedLimit
) != 0)
121 /*If the handler's visible download limit is under the new one,
122 we move the KiB/s which are different to the pool*/
123 pool
= pool
+ (uploadLimit() / n
- handler
->uploadLimit(Transfer::VisibleSpeedLimit
));
124 else if (handler
->uploadSpeed() + 10 < uploadLimit() / n
)
126 /*When the downloadSpeed of the handler is under the new downloadLimit + 10 then we
127 set the downloadLimit to the downloadSpeed + 10*/
128 pool
= pool
+ uploadLimit() / n
- handler
->uploadSpeed() + 10;
129 handler
->setUploadLimit(handler
->uploadSpeed() + 10, Transfer::InvisibleSpeedLimit
);
133 handler
->setUploadLimit(uploadLimit() / n
, Transfer::InvisibleSpeedLimit
);
134 transfergroupsNeedSpeed
.append(handler
);
137 foreach (TransferGroupHandler
*handler
, transfergroupsNeedSpeed
)
139 handler
->setUploadLimit(uploadLimit() / n
+ pool
/ transfergroupsNeedSpeed
.count(), Transfer::InvisibleSpeedLimit
);
143 void TransferGroupScheduler::setDownloadLimit(int limit
)
145 m_downloadLimit
= limit
;
146 calculateDownloadLimit();
149 void TransferGroupScheduler::setUploadLimit(int limit
)
151 m_uploadLimit
= limit
;
152 calculateUploadLimit();
155 #include "transfergroupscheduler.moc"