class QuartzTorrent::TorrentQueue
Public Class Methods
new(maxIncomplete, maxActive)
click to toggle source
The maxIncomplete and maxActive parameters specify how many torrents may be unpaused and unqueued at once. Parameter maxActive is the total maximum number of active torrents (unpaused, unqueued), and maxIncomplete is a subset of maxActive that are incomplete and thus downloading (as opposed to only uploading). An exception is thrown if maxIncomplete > maxActive.
# File lib/quartz_torrent/torrentqueue.rb, line 10 def initialize(maxIncomplete, maxActive) raise "The maximum number of running torrents may not be larger than the maximum number of unqueued torrents" if maxIncomplete > maxActive @maxIncomplete = maxIncomplete @maxActive = maxActive @queue = [] @logger = LogManager.getLogger("queue") end
Public Instance Methods
dequeue(torrentDatas)
click to toggle source
Compute which torrents can now be unqueued based on the state of running torrents. Parameter torrentDatas should be an array of TorrentData
that the decision will be based off. At a minimum these items should respond to ‘paused’, ‘queued’, ‘state’, ‘queued=’
# File lib/quartz_torrent/torrentqueue.rb, line 21 def dequeue(torrentDatas) numActive = 0 numIncomplete = 0 torrentDatas.each do |torrentData| next if torrentData.paused || torrentData.queued numIncomplete += 1 if incomplete?(torrentData) numActive += 1 end @logger.debug "incomplete: #{numIncomplete}/#{@maxIncomplete} active: #{numActive}/#{@maxActive}" @logger.debug "Queue contains #{size} torrents" torrents = [] while numActive < @maxActive torrentData = nil if numIncomplete < @maxIncomplete # Unqueue first incomplete torrent from queue torrentData = dequeueFirstMatching{ |torrentData| incomplete?(torrentData)} @logger.debug "#{torrentData ? "dequeued" : "failed to dequeue"} an incomplete torrent" numIncomplete += 1 if torrentData end if ! torrentData # Unqueue first complete (uploading) torrent from queue torrentData = dequeueFirstMatching{ |torrentData| !incomplete?(torrentData)} @logger.debug "#{torrentData ? "dequeued" : "failed to dequeue"} a complete torrent" end numActive += 1 if torrentData if torrentData torrentData.queued = false torrents.push torrentData else break end end @logger.debug "Will dequeue #{torrents.size}" torrents end
push(torrentData)
click to toggle source
# File lib/quartz_torrent/torrentqueue.rb, line 62 def push(torrentData) torrentData.queued = true @queue.push torrentData end
size()
click to toggle source
# File lib/quartz_torrent/torrentqueue.rb, line 72 def size @queue.size end
unshift(torrentData)
click to toggle source
# File lib/quartz_torrent/torrentqueue.rb, line 67 def unshift(torrentData) torrentData.queued = true @queue.unshift torrentData end
Private Instance Methods
dequeueFirstMatching() { |torrentData| ... }
click to toggle source
# File lib/quartz_torrent/torrentqueue.rb, line 82 def dequeueFirstMatching index = @queue.index{ |torrentData| yield(torrentData) } if index @queue.delete_at index else nil end end
incomplete?(torrentData)
click to toggle source
# File lib/quartz_torrent/torrentqueue.rb, line 78 def incomplete?(torrentData) torrentData.state != :uploading end