亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? storagewrapper.py

?? BitTorrentABC-Linux-V.2.4.3源碼
?? PY
?? 第 1 頁 / 共 2 頁
字號:
# Written by Bram Cohen
# see LICENSE.txt for license information

from sha import sha
from threading import Event
true = 1
false = 0

def dummy_status(fractionDone = None, activity = None):
    pass

def dummy_data_flunked(size):
    pass

class StorageWrapper:
    def __init__(self, storage, request_size, hashes, 
            piece_size, finished, failed, 
            statusfunc = dummy_status, flag = Event(), check_hashes = true,
            data_flunked = dummy_data_flunked, backfunc = None,
            config = {}, unpauseflag = None):
        self.storage = storage
        self.request_size = request_size
        self.hashes = hashes
        self.piece_size = piece_size
        self.piece_length = piece_size
        self.data_flunked = data_flunked
        self.backfunc = backfunc
        self.config = config
        self.alloc_type = config.get('alloc_type','normal')
        self.bgalloc_enabled = false
        self.bgalloc_active = false
        self.alloc_buf = chr(0xFF) * piece_size
        self.total_length = storage.get_total_length()
        self.amount_left = self.total_length
        if self.total_length <= piece_size * (len(hashes) - 1):
            raise ValueError, 'bad data from tracker - total too small'
        if self.total_length > piece_size * len(hashes):
            raise ValueError, 'bad data from tracker - total too big'
        self.finished = finished
        self.failed = failed
        self.numactive = [0] * len(hashes)
        self.inactive_requests = [1] * len(hashes)
        self.amount_inactive = self.total_length
        self.endgame = false
        self.have = [false] * len(hashes)
        self.waschecked = [check_hashes] * len(hashes)
        self.places = {}
        self.holes = []
        self.stat_active = {}
        self.stat_new = {}
        self.dirty = {}
        self.stat_numflunked = 0
        self.stat_numdownloaded = 0
        self.stat_numfound = 0
        
        if len(hashes) == 0:
            finished()
            return
        targets = {}
        total = len(hashes)
        for i in xrange(len(hashes)):
            if not self._waspre(i):
                if not targets.has_key(hashes[i]):
                    targets[hashes[i]] = [i]
                else:
                    targets[hashes[i]] = [] # in case of a hash collision, discard
                total -= 1
        numchecked = 0.0
        if total and check_hashes:
            statusfunc(activity = 'checking existing data', fractionDone = 0)
        def markgot(piece, pos, self = self, check_hashes = check_hashes):
            self.places[piece] = pos
            self.have[piece] = true
            self.amount_left -= self._piecelen(piece)
            self.amount_inactive -= self._piecelen(piece)
            self.inactive_requests[piece] = None
            self.waschecked[piece] = check_hashes
            self.stat_numfound += 1
        lastlen = self._piecelen(len(hashes) - 1)
        out_of_place = 0
        updatenum = int(total/300)+1
        updatecount = 0
        for i in xrange(len(hashes)):
            if not self._waspre(i):
                self.holes.append(i)
            elif not check_hashes:
                markgot(i, i)
            else:
                try:
                    v = self.storage.read(piece_size * i, self._piecelen(i))
                except IOError, e:
                        self.failed('IO Error ' + str(e))
                        return
                sh = sha(v[:lastlen])
                sp = sh.digest()
                sh.update(v[lastlen:])
                s = sh.digest()
                if s == hashes[i]:
                    markgot(i, i)
                elif targets.get(s) and self._piecelen(i) == self._piecelen(targets[s][-1]):
                    markgot(targets[s].pop(), i)
                    out_of_place += 1
                elif not self.have[-1] and sp == hashes[-1] and (i == len(hashes) - 1 or not self._waspre(len(hashes) - 1)):
                    markgot(len(hashes) - 1, i)
                    out_of_place += 1
                else:
                    self.places[i] = i
                if unpauseflag is not None and not unpauseflag.isSet():
                    unpauseflag.wait()
                if flag.isSet():
                    return
                numchecked += 1
                updatecount += 1
                if updatecount >= updatenum:
                    updatecount = 0
                    statusfunc(fractionDone = numchecked / total)
        statusfunc(fractionDone = 1.0)
        if self.amount_left == 0:
            finished()
        elif self.alloc_type == 'pre-allocate' and self.holes:
            numholes = len(self.holes)
            statusfunc(activity = 'allocating disk space', fractionDone = 1.0)
            updatenum = int(len(self.holes)/300)+1
            updatecount = 0
            while self.holes:
                if unpauseflag is not None and not unpauseflag.isSet():
                    unpauseflag.wait()
                if flag.isSet():
                    return
                self._doalloc()
                updatecount += 1
                if updatecount >= updatenum:
                    updatecount = 0
                    statusfunc(fractionDone = float(len(self.holes)) / numholes)
            self.storage.flush()
            statusfunc(fractionDone = 0.0)
        elif self.alloc_type == 'sparse':
            self.storage.top_off()  # sets file lengths to their final size
            self.holes = []
            if out_of_place > 0:
                statusfunc(activity = 'moving data', fractionDone = 1.0)
            tomove = out_of_place
            updatenum = int(out_of_place/300)+1
            updatecount = 0
            for i in xrange(len(hashes)):
                if unpauseflag is not None and not unpauseflag.isSet():
                    unpauseflag.wait()
                if flag.isSet():
                    return
                if not self.places.has_key(i):
                    self.places[i] = i
                elif self.places[i] != i:
                    try:
                        old = self.storage.read(self.piece_size * self.places[i], self._piecelen(i))
                        self.storage.write(self.piece_size * i, old)
                    except IOError, e:
                        self.failed('IO Error ' + str(e))
                        return
                    self.places[i] = i
                    tomove -= 1
                    updatecount += 1
                    if updatecount >= updatenum:
                        updatecount = 0
                        statusfunc(fractionDone = float(tomove)/out_of_place)
            self.storage.flush()
            statusfunc(fractionDone = 0.0)
        elif self.alloc_type == 'background' and self.backfunc is not None:
            self.bgalloc()
            

    def bgalloc(self):
        if self.holes and not self.bgalloc_enabled:
            self.bgalloc_enabled = true
            self.bgalloc_active = true
            self.backfunc(self._bgalloc,0.1)
        else:
            self.storage.flush()    # force a flush whenever the "finish allocation" button
                                    # is hit

    def _bgalloc(self):
        if self.holes:
            self._doalloc()
            self.backfunc(self._bgalloc,
                  float(self.piece_size)/(self.config.get('alloc_rate',1.0)*1048576))
        else:
            self.storage.flush()
            self.bgalloc_active = false

    def _doalloc(self):
      try:
        n = self.holes.pop(0)
        if self.places.has_key(n):
            oldpos = self.places[n]
            self.places[oldpos] = oldpos
            old = self.storage.read(self.piece_size * oldpos, self._piecelen(n))
            self.storage.write(self.piece_size * n, old)
        else:
            self.storage.write(self.piece_size * n, self.alloc_buf[:self._piecelen(n)])
        self.places[n] = n
      except IOError, e:
        self.failed('IO Error ' + str(e))

    def _waspre(self, piece):
        return self.storage.was_preallocated(piece * self.piece_size, self._piecelen(piece))

    def _piecelen(self, piece):
        if piece < len(self.hashes) - 1:
            return self.piece_size
        else:
            return self.total_length - piece * self.piece_size

    def get_amount_left(self):
        return self.amount_left

    def do_I_have_anything(self):
        return self.amount_left < self.total_length

    def _make_inactive(self, index):
        length = min(self.piece_size, self.total_length - self.piece_size * index)
        l = []
        x = 0
        while x + self.request_size < length:
            l.append((x, self.request_size))
            x += self.request_size
        l.append((x, length - x))
        self.inactive_requests[index] = l

    def is_endgame(self):
        return self.endgame

    def reset_endgame(self):
        self.endgame = false

    def get_have_list(self):
        return self.have

    def do_I_have(self, index):
        return self.have[index]

    def do_I_have_requests(self, index):
        return not not self.inactive_requests[index]

    def is_unstarted(self, index):
        return ( not self.have[index] and not self.numactive[index]
                 and not self.dirty.has_key(index) )

    def get_hash(self, index):
        return self.hashes[index]

    def new_request(self, index):
        # returns (begin, length)
        if self.inactive_requests[index] == 1:
            self._make_inactive(index)
        self.numactive[index] += 1
        self.stat_active[index] = 1
        if not self.dirty.has_key(index):
            self.stat_new[index] = 1
        rs = self.inactive_requests[index]
        r = min(rs)
        rs.remove(r)
        self.amount_inactive -= r[1]
        if self.amount_inactive == 0:
            self.endgame = true
        return r

    def piece_came_in(self, index, begin, piece):
        try:
            return self._piece_came_in(index, begin, piece)
        except IOError, e:
            self.failed('IO Error ' + str(e))

    def _piece_came_in(self, index, begin, piece):
        if not self.places.has_key(index):
            n = self.holes.pop(0)
            if self.places.has_key(n):
                oldpos = self.places[n]
                old = self.storage.read(self.piece_size * oldpos, self._piecelen(n))
                self.storage.write(self.piece_size * n, old)
                self.places[n] = n
                if index == oldpos or index in self.holes:
                    self.places[index] = oldpos
                else:
                    for p, v in self.places.items():
                        if v == index:
                            break
                    self.places[index] = index
                    self.places[p] = oldpos
                    old = self.storage.read(self.piece_size * index, self.piece_size)
                    self.storage.write(self.piece_size * oldpos, old)
            elif index in self.holes or index == n:
                self.storage.write(self.piece_size * n, self.alloc_buf[:self._piecelen(n)])
                self.places[index] = n
            else:
                for p, v in self.places.items():
                    if v == index:
                        break
                self.places[index] = index
                self.places[p] = n
                old = self.storage.read(self.piece_size * index, self._piecelen(n))
                self.storage.write(self.piece_size * n, old)
        self.storage.write(self.places[index] * self.piece_size + begin, piece)
        self.dirty[index] = 1
        self.numactive[index] -= 1
        if not self.numactive[index]:

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲日本免费电影| 日韩精品中文字幕一区二区三区| 欧美激情一区二区在线| 国产乱码精品一区二区三| 精品国产一区二区三区忘忧草| 奇米一区二区三区av| 日韩三级视频中文字幕| 狠狠久久亚洲欧美| 日产国产欧美视频一区精品| 欧美性受xxxx| 免费成人美女在线观看.| 26uuu亚洲综合色| 成人激情文学综合网| 亚洲精品精品亚洲| 91精品国产综合久久精品app| 精品无人区卡一卡二卡三乱码免费卡 | 在线观看一区不卡| 免费日本视频一区| 日本一区二区综合亚洲| 色偷偷成人一区二区三区91 | 尤物视频一区二区| 欧美一区二区三区四区高清| 国产一区免费电影| 一区二区三区四区视频精品免费 | 国产传媒欧美日韩成人| 亚洲综合激情另类小说区| 欧美一级夜夜爽| 成人妖精视频yjsp地址| 亚洲图片欧美综合| 国产片一区二区三区| 一本一本久久a久久精品综合麻豆| 视频在线观看91| 中文字幕第一区第二区| 在线综合+亚洲+欧美中文字幕| 国产一区二区三区四区五区入口 | 欧美性受xxxx黑人xyx性爽| 精品一区二区av| 亚洲色图20p| 精品美女被调教视频大全网站| eeuss国产一区二区三区| 日本欧美在线看| 亚洲日本在线天堂| 久久综合网色—综合色88| 欧美网站大全在线观看| 国产福利不卡视频| 人人爽香蕉精品| 亚洲精品一二三四区| 久久久91精品国产一区二区三区| 欧美日韩视频在线一区二区| 不卡一卡二卡三乱码免费网站| 毛片av中文字幕一区二区| 亚洲自拍欧美精品| 国产精品免费aⅴ片在线观看| 日韩精品一区二区三区四区| 欧美影院一区二区三区| 不卡大黄网站免费看| 国产老肥熟一区二区三区| 青青草伊人久久| 五月综合激情网| 亚洲自拍偷拍九九九| 综合激情网...| 欧美国产精品一区二区| 久久青草欧美一区二区三区| 欧美夫妻性生活| 欧美亚洲丝袜传媒另类| 色综合久久中文综合久久牛| 丁香婷婷深情五月亚洲| 国产一区二区三区四区五区美女| 日韩成人午夜精品| 午夜精彩视频在线观看不卡| 樱花影视一区二区| 亚洲男人的天堂在线观看| 麻豆精品在线播放| 视频一区中文字幕国产| 日本亚洲一区二区| 婷婷激情综合网| 三级久久三级久久| 日本中文字幕一区二区有限公司| 婷婷国产v国产偷v亚洲高清| 视频在线观看91| 蜜桃视频一区二区三区在线观看| 日本午夜精品视频在线观看| 视频一区二区三区中文字幕| 三级影片在线观看欧美日韩一区二区| 亚洲国产一区二区三区| 婷婷夜色潮精品综合在线| 青青国产91久久久久久| 麻豆精品新av中文字幕| 国产一区二区视频在线| 国产福利视频一区二区三区| 成人高清免费在线播放| a4yy欧美一区二区三区| 色婷婷综合激情| 欧美日韩激情一区二区三区| 3atv在线一区二区三区| 欧美成人video| 久久精品人人做| 亚洲欧洲精品成人久久奇米网| 亚洲男同性恋视频| 性做久久久久久| 久久99久久99| 国产激情偷乱视频一区二区三区| 成人av免费在线| 在线视频欧美精品| 精品免费99久久| 国产精品看片你懂得| 一区二区三区四区在线免费观看| 日韩中文字幕91| 国产成人在线免费观看| 色悠悠亚洲一区二区| 欧美一区二区视频网站| 国产欧美日韩精品一区| 亚洲一区二区三区在线看| 久久99九九99精品| 一本色道久久综合亚洲精品按摩| 欧美精品 日韩| 欧美国产一区视频在线观看| 午夜精品成人在线| 大美女一区二区三区| 欧美绝品在线观看成人午夜影视| 亚洲6080在线| 国产91在线观看| 欧美高清一级片在线| 国产精品成人一区二区三区夜夜夜 | 成人激情免费电影网址| 欧美美女一区二区在线观看| 国产欧美一区二区精品秋霞影院| 亚洲影视在线播放| 成人一区二区三区中文字幕| 91精品在线免费观看| 亚洲欧洲日韩一区二区三区| 美腿丝袜亚洲色图| 欧美性猛交xxxxxxxx| 久久久精品欧美丰满| 日韩成人精品在线| 99re这里只有精品6| 26uuuu精品一区二区| 亚洲成人激情综合网| av不卡在线播放| 久久久精品国产99久久精品芒果| 午夜久久福利影院| 91免费观看在线| 日本一区二区成人| 激情综合网av| 日韩午夜av电影| 天堂蜜桃91精品| 欧美午夜精品久久久久久孕妇 | 亚洲欧美日韩系列| 国产成人鲁色资源国产91色综| 69成人精品免费视频| 亚洲一区二区三区小说| 99这里只有久久精品视频| 国产婷婷精品av在线| 国产在线一区观看| 欧美成人性战久久| 日本不卡一区二区| 欧美乱熟臀69xxxxxx| 亚洲国产一区二区在线播放| 91网上在线视频| 国产精品久久久久久久久果冻传媒| 精品一区二区三区香蕉蜜桃| 欧美一级高清大全免费观看| 亚洲不卡av一区二区三区| 欧美性猛片aaaaaaa做受| 一区二区三区免费观看| 91激情在线视频| 亚洲最大的成人av| 欧美亚洲综合久久| 亚洲国产视频网站| 欧美视频完全免费看| 亚洲激情成人在线| 91福利社在线观看| 亚洲国产精品久久艾草纯爱| 在线观看视频91| 亚洲国产精品久久久久秋霞影院| 欧洲精品一区二区| 天堂一区二区在线| 精品国产乱码91久久久久久网站| 极品少妇一区二区三区精品视频| 日韩免费看的电影| 国产精品88888| 国产精品久久久久三级| 91蝌蚪国产九色| 亚洲综合清纯丝袜自拍| 欧美日韩国产在线观看| 人人超碰91尤物精品国产| 精品国免费一区二区三区| 国产成人av一区二区三区在线观看| 欧美国产在线观看| 95精品视频在线| 五月激情综合网| 久久久久久久久久久久久女国产乱 | 怡红院av一区二区三区| 成人免费在线播放视频| 色偷偷88欧美精品久久久| 婷婷久久综合九色综合绿巨人| 久久综合资源网| 色婷婷精品久久二区二区蜜臀av| 日韩电影一区二区三区| 日本一区二区三区在线不卡|