def _setup_torrent_download(self, dcfg, pstate, initialdlstatus, lmcreatedcallback, lmvodeventcallback):
        self.dllock.acquire()
        try:
            torrentdef = self.get_def()
            metainfo = torrentdef.get_metainfo()
            self.correctedinfoname = fix_filebasename(torrentdef.get_name_as_unicode())
            if dcfg is not None and DEBUG:
                log(self.log_prefix + '_setup_torrent_download: selected_files', dcfg.dlconfig['selected_files'])
            if DEBUG:
                log(self.log_prefix + '_setup_torrent_download: piece size', metainfo['info']['piece length'])
            itrackerurl = self.session.get_internal_tracker_url()
            metainfo = self.tdef.get_metainfo()
            usingitracker = False
            if DEBUG:
                if pstate is None:
                    resumedata = None
                else:
                    resumedata = pstate['engineresumedata']
                log(self.log_prefix + '_setup_torrent_download: resumedata', resumedata)
            if itrackerurl.endswith('/'):
                slashless = itrackerurl[:-1]
            else:
                slashless = itrackerurl
            if 'announce' in metainfo and (metainfo['announce'] == itrackerurl or metainfo['announce'] == slashless):
                usingitracker = True
            elif 'announce-list' in metainfo:
                for tier in metainfo['announce-list']:
                    if itrackerurl in tier or slashless in tier:
                        usingitracker = True
                        break

            if usingitracker:
                if DEBUG:
                    log(self.log_prefix + '_setup_torrent_download: using internal tracker')
                self.session.add_to_internal_tracker(self.tdef)
            elif DEBUG:
                log(self.log_prefix + '_setup_torrent_download: not using internal tracker')
            if dcfg is None:
                cdcfg = DownloadStartupConfig()
            else:
                cdcfg = dcfg
            if cdcfg.is_hidden():
                cdcfg.set_max_conns(10)
                cdcfg.set_max_conns_to_initiate(10)
            self.dlconfig = copy.copy(cdcfg.dlconfig)
            for k, v in self.session.get_current_startup_config_copy().sessconfig.iteritems():
                self.dlconfig.setdefault(k, v)

            self.set_filepieceranges(metainfo)
            self.dlruntimeconfig = {}
            self.dlruntimeconfig['max_desired_upload_rate'] = 0
            self.dlruntimeconfig['max_desired_download_rate'] = 0
            if DEBUG:
                log(self.log_prefix + '_setup_torrent_download: initialdlstatus', `(self.tdef.get_name_as_unicode())`, initialdlstatus)
            self.dlconfig['cs_keys'] = self.tdef.get_cs_keys_as_ders()
            self.dlconfig['permid'] = self.session.get_permid()
            if self.dlconfig['cs_keys']:
                log(self.log_prefix + '_setup_torrent_download: this is a closed swarm')
            if pstate is not None and pstate.has_key('dlstate'):
                self.progressbeforestop = pstate['dlstate'].get('progress', 0.0)
            if initialdlstatus != DLSTATUS_STOPPED:
                if pstate is None or pstate['dlstate']['status'] != DLSTATUS_STOPPED:
                    self.starting = True
                    self.create_engine_wrapper(lmcreatedcallback, pstate, lmvodeventcallback, initialdlstatus)
            self.pstate_for_restart = pstate
            self.dllock.release()
        except Exception as e:
            log_exc()
            self.set_error(e)
            self.dllock.release()