diff --git a/src/client.py b/src/client.py --- a/src/client.py +++ b/src/client.py @@ -7,7 +7,7 @@ from datetime import datetime import config as conf import stats from util import Progress -from hashtree import HashTree +from hashtree import HashTree,hashBlock from networkers import NetworkReader,NetworkWriter @@ -36,13 +36,19 @@ class Connection: class Client: - def __init__(self,filename): + def __init__(self,filename,treeFile=""): self._incoming=None self._outcoming=None self._filename=filename + self._treeFile=treeFile print(datetime.now(), "initializing...") - self._localTree=HashTree.fromFile(self._filename) + if treeFile: + self._tree=HashTree.load(treeFile) + else: + self._tree=HashTree.fromFile(filename) + + self._newLeaves=dict() ## Asks server for node hashes to determine which are to be transferred. # @@ -50,7 +56,7 @@ class Client: # # Requests nodes in order of a batch DFS. Needs stack of size O(treeDepth*batchSize). Nodes in each tree level are accessed in order. def negotiate(self): - localTree=self._localTree + localTree=self._tree blocksToTransfer=[] nodeStack=collections.deque([0]) # root @@ -135,6 +141,9 @@ class Client: dataFile.seek(i2*HashTree.BLOCK_SIZE) dataFile.write(binData) + if self._treeFile: + self._newLeaves[i2+self._tree.leafStart]=hashBlock(binData) + log.info("block #{0}: {1}...{2}".format(i2,binData[:5],binData[-5:])) stats.logTransferredBlock() @@ -147,5 +156,11 @@ class Client: log.info("closing session...") dataFile.close() + if self._treeFile: + log.info("updating hash tree...") + for (k,v) in self._newLeaves.items(): + self._tree.updateLeaf(k, v) + self._tree.save(self._treeFile) + def setConnection(self,connection): (self._incoming,self._outcoming)=connection