def startDownload(torrentData)
      # Add a listener for when the tracker's peers change.
      torrentData.peerChangeListener = Proc.new do
        @logger.debug "#{QuartzTorrent.bytesToHex(torrentData.infoHash)}: Managing peers on peer change event"
  
        # Non-recurring and immediate timer
        torrentData.managePeersTimer =
          @reactor.scheduleTimer(@managePeersPeriod, [:manage_peers, torrentData.infoHash], false, true)
      end
      torrentData.trackerClient.addPeersChangedListener torrentData.peerChangeListener

      # Schedule peer connection management. Recurring and immediate 
      if ! torrentData.managePeersTimer 
        torrentData.managePeersTimer =
          @reactor.scheduleTimer(@managePeersPeriod, [:manage_peers, torrentData.infoHash], true, true)
      end

      # Schedule requesting blocks from peers. Recurring and not immediate
      torrentData.requestBlocksTimer =
        @reactor.scheduleTimer(@requestBlocksPeriod, [:request_blocks, torrentData.infoHash], true, false)
      torrentData.state = :running
    end
def startDownload(torrentData)
      # Add a listener for when the tracker's peers change.
      torrentData.peerChangeListener = Proc.new do
        @logger.debug "#{QuartzTorrent.bytesToHex(torrentData.infoHash)}: Managing peers on peer change event"
  
        # Non-recurring and immediate timer
        torrentData.managePeersTimer =
          @reactor.scheduleTimer(@managePeersPeriod, [:manage_peers, torrentData.infoHash], false, true)
      end
      torrentData.trackerClient.addPeersChangedListener torrentData.peerChangeListener

      # Schedule peer connection management. Recurring and immediate 
      if ! torrentData.managePeersTimer 
        torrentData.managePeersTimer =
          @reactor.scheduleTimer(@managePeersPeriod, [:manage_peers, torrentData.infoHash], true, true)
      end

      # Schedule requesting blocks from peers. Recurring and not immediate
      torrentData.requestBlocksTimer =
        @reactor.scheduleTimer(@requestBlocksPeriod, [:request_blocks, torrentData.infoHash], true, false)
      torrentData.state = :running
    end
Start the actual torrent download. This method schedules the necessary timers and registers the necessary listeners
 and changes the state to :running. It is meant to be called after checking for existing pieces or downloading the
 torrent metadata (if this is a magnet link torrent)