X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=apt_dht_Khashmir%2FDHT.py;h=23b2755313f0d1f91e7f08de7829674bb37ae614;hb=2995ddfcfe23b24e366156530b2207d434fb8344;hp=8930ffe9d58c40e83e169d0ceb3b964ed458cb10;hpb=842adfabdd1ea04a07998c0bfbbb21ffa6ecbfad;p=quix0rs-apt-p2p.git diff --git a/apt_dht_Khashmir/DHT.py b/apt_dht_Khashmir/DHT.py index 8930ffe..23b2755 100644 --- a/apt_dht_Khashmir/DHT.py +++ b/apt_dht_Khashmir/DHT.py @@ -1,4 +1,5 @@ +from datetime import datetime import os, sha, random from twisted.internet import defer, reactor @@ -9,6 +10,9 @@ from zope.interface import implements from apt_dht.interfaces import IDHT from khashmir import Khashmir +from bencode import bencode, bdecode + +khashmir_dir = 'apt-dht-Khashmir' class DHTError(Exception): """Represents errors that occur in the DHT.""" @@ -35,7 +39,9 @@ class DHT: self.config_parser = config self.section = section self.config = {} - self.cache_dir = self.config_parser.get(section, 'cache_dir') + self.cache_dir = os.path.join(self.config_parser.get(section, 'cache_dir'), khashmir_dir) + if not os.path.exists(self.cache_dir): + os.makedirs(self.cache_dir) self.bootstrap = self.config_parser.getstringlist(section, 'BOOTSTRAP') self.bootstrap_node = self.config_parser.getboolean(section, 'BOOTSTRAP_NODE') for k in self.config_parser.options(section): @@ -134,7 +140,7 @@ class DHT: def _getValue(self, key, result): if result: - self.retrieved.setdefault(key, []).extend(result) + self.retrieved.setdefault(key, []).extend([bdecode(r) for r in result]) else: final_result = [] if key in self.retrieved: @@ -152,21 +158,23 @@ class DHT: if not self.joined: raise DHTError, "have not joined a network yet" - if key in self.storing and value in self.storing[key]: + bvalue = bencode(value) + + if key in self.storing and bvalue in self.storing[key]: raise DHTError, "already storing that key with the same value" d = defer.Deferred() - self.khashmir.storeValueForKey(key, value, self._storeValue) - self.storing.setdefault(key, {})[value] = d + self.khashmir.storeValueForKey(key, bvalue, self._storeValue) + self.storing.setdefault(key, {})[bvalue] = d return d - def _storeValue(self, key, value, result): - if key in self.storing and value in self.storing[key]: + def _storeValue(self, key, bvalue, result): + if key in self.storing and bvalue in self.storing[key]: if len(result) > 0: - self.storing[key][value].callback(result) + self.storing[key][bvalue].callback(result) else: - self.storing[key][value].errback(DHTError('could not store value %s in key %s' % (value, key))) - del self.storing[key][value] + self.storing[key][bvalue].errback(DHTError('could not store value %s in key %s' % (bvalue, key))) + del self.storing[key][bvalue] if len(self.storing[key].keys()) == 0: del self.storing[key]