Rev470, Keep track downloaded optional files in hashfield, Peer getHashfield command, Check optional files on verifyFiles, Test hashfield, Test hashfield exchange
This commit is contained in:
parent
f8fd58866b
commit
9400e9f58f
10 changed files with 178 additions and 18 deletions
|
@ -8,6 +8,7 @@ from cStringIO import StringIO
|
|||
from Debug import Debug
|
||||
from Config import config
|
||||
from util import helper
|
||||
from PeerHashfield import PeerHashfield
|
||||
|
||||
if config.use_tempfiles:
|
||||
import tempfile
|
||||
|
@ -27,8 +28,8 @@ class Peer(object):
|
|||
self.key = "%s:%s" % (ip, port)
|
||||
|
||||
self.connection = None
|
||||
self.hashfield = array.array("H") # Got optional files hash_id
|
||||
self.last_hashfield = None # Last time hashfiled downloaded
|
||||
self.hashfield = PeerHashfield() # Got optional files hash_id
|
||||
self.last_hashfield = 0 # Last time hashfiled downloaded
|
||||
self.last_found = time.time() # Time of last found in the torrent tracker
|
||||
self.last_response = None # Time of last successful response from peer
|
||||
self.last_ping = None # Last response time for ping
|
||||
|
@ -221,6 +222,16 @@ class Peer(object):
|
|||
self.log("Added peers using pex: %s" % added)
|
||||
return added
|
||||
|
||||
# Request optional files hashfield from peer
|
||||
def getHashfield(self):
|
||||
self.last_hashfield = time.time()
|
||||
res = self.request("getHashfield", {"site": self.site.address})
|
||||
if res and "error" not in res:
|
||||
self.hashfield.replaceFromString(res["hashfield_raw"])
|
||||
return self.hashfield
|
||||
else:
|
||||
return False
|
||||
|
||||
# List modified files since the date
|
||||
# Return: {inner_path: modification date,...}
|
||||
def listModified(self, since):
|
||||
|
|
42
src/Peer/PeerHashfield.py
Normal file
42
src/Peer/PeerHashfield.py
Normal file
|
@ -0,0 +1,42 @@
|
|||
import array
|
||||
|
||||
|
||||
class PeerHashfield():
|
||||
def __init__(self):
|
||||
self.storage = self.createStoreage()
|
||||
|
||||
def createStoreage(self):
|
||||
storage = array.array("H")
|
||||
self.append = storage.append
|
||||
self.remove = storage.remove
|
||||
self.tostring = storage.tostring
|
||||
self.fromstring = storage.fromstring
|
||||
self.__len__ = storage.__len__
|
||||
self.__iter__ = storage.__iter__
|
||||
return storage
|
||||
|
||||
def appendHash(self, hash):
|
||||
hash_id = int(hash[0:4], 16)
|
||||
if hash_id not in self:
|
||||
self.append(hash_id)
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def removeHash(self, hash):
|
||||
hash_id = int(hash[0:4], 16)
|
||||
if hash_id in self:
|
||||
self.remove(hash_id)
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def getHashId(self, hash):
|
||||
return int(hash[0:4], 16)
|
||||
|
||||
def hasHash(self, hash):
|
||||
return int(hash[0:4], 16) in self
|
||||
|
||||
def replaceFromString(self, hashfield_raw):
|
||||
self.storage = self.createStoreage()
|
||||
self.fromstring(hashfield_raw)
|
|
@ -1 +1,2 @@
|
|||
from Peer import Peer
|
||||
from PeerHashfield import PeerHashfield
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue