source file: /home/buildslave/tahoe/edgy/build/src/allmydata/immutable/filenode.py
file stats: 113 lines, 113 executed: 100.0% covered
   1. 
   2. from zope.interface import implements
   3. from twisted.internet import defer
   4. from allmydata.interfaces import IFileNode, IFileURI, IURI, ICheckable
   5. from allmydata import uri
   6. from allmydata.immutable.checker import Results, DeepCheckResults, \
   7.      SimpleCHKFileChecker, SimpleCHKFileVerifier
   8. 
   9. class FileNode:
  10.     implements(IFileNode, ICheckable)
  11.     checker_class = SimpleCHKFileChecker
  12.     verifier_class = SimpleCHKFileVerifier
  13. 
  14.     def __init__(self, uri, client):
  15.         u = IFileURI(uri)
  16.         self.u = u
  17.         self.uri = u.to_string()
  18.         self._client = client
  19. 
  20.     def get_uri(self):
  21.         return self.uri
  22. 
  23.     def is_mutable(self):
  24.         return False
  25. 
  26.     def is_readonly(self):
  27.         return True
  28. 
  29.     def get_readonly_uri(self):
  30.         return self.uri
  31. 
  32.     def get_size(self):
  33.         return self.u.get_size()
  34. 
  35.     def __hash__(self):
  36.         return hash((self.__class__, self.uri))
  37.     def __cmp__(self, them):
  38.         if cmp(type(self), type(them)):
  39.             return cmp(type(self), type(them))
  40.         if cmp(self.__class__, them.__class__):
  41.             return cmp(self.__class__, them.__class__)
  42.         return cmp(self.uri, them.uri)
  43. 
  44.     def get_verifier(self):
  45.         return self.u.get_verifier()
  46. 
  47.     def get_storage_index(self):
  48.         return self.u.storage_index
  49. 
  50.     def check(self, verify=False, repair=False):
  51.         assert repair is False  # not implemented yet
  52.         storage_index = self.u.storage_index
  53.         k = self.u.needed_shares
  54.         N = self.u.total_shares
  55.         size = self.u.size
  56.         ueb_hash = self.u.uri_extension_hash
  57.         if verify:
  58.             v = self.verifier_class(self._client,
  59.                                     storage_index, k, N, size, ueb_hash)
  60.         else:
  61.             v = self.checker_class(self._client, storage_index, k, N)
  62.         return v.start()
  63. 
  64.     def deep_check(self, verify=False, repair=False):
  65.         d = self.check(verify, repair)
  66.         def _done(r):
  67.             dr = DeepCheckResults(self.get_verifier().storage_index)
  68.             dr.add_check(r)
  69.             return dr
  70.         d.addCallback(_done)
  71.         return d
  72. 
  73.     def download(self, target):
  74.         downloader = self._client.getServiceNamed("downloader")
  75.         return downloader.download(self.uri, target)
  76. 
  77.     def download_to_data(self):
  78.         downloader = self._client.getServiceNamed("downloader")
  79.         return downloader.download_to_data(self.uri)
  80. 
  81. 
  82. 
  83. class LiteralFileNode:
  84.     implements(IFileNode, ICheckable)
  85. 
  86.     def __init__(self, my_uri, client):
  87.         u = IFileURI(my_uri)
  88.         assert isinstance(u, uri.LiteralFileURI)
  89.         self.uri = u.to_string()
  90.         self._client = client
  91. 
  92.     def get_uri(self):
  93.         return self.uri
  94. 
  95.     def is_mutable(self):
  96.         return False
  97. 
  98.     def is_readonly(self):
  99.         return True
 100. 
 101.     def get_readonly_uri(self):
 102.         return self.uri
 103. 
 104.     def get_size(self):
 105.         return len(IURI(self.uri).data)
 106. 
 107.     def __hash__(self):
 108.         return hash((self.__class__, self.uri))
 109.     def __cmp__(self, them):
 110.         if cmp(type(self), type(them)):
 111.             return cmp(type(self), type(them))
 112.         if cmp(self.__class__, them.__class__):
 113.             return cmp(self.__class__, them.__class__)
 114.         return cmp(self.uri, them.uri)
 115. 
 116.     def get_verifier(self):
 117.         return None
 118. 
 119.     def get_storage_index(self):
 120.         return None
 121. 
 122.     def check(self, verify=False, repair=False):
 123.         # neither verify= nor repair= affect LIT files
 124.         r = Results(None)
 125.         r.healthy = True
 126.         r.problems = []
 127.         return defer.succeed(r)
 128. 
 129.     def deep_check(self, verify=False, repair=False):
 130.         d = self.check(verify, repair)
 131.         def _done(r):
 132.             dr = DeepCheckResults(None)
 133.             dr.add_check(r)
 134.             return dr
 135.         d.addCallback(_done)
 136.         return d
 137. 
 138.     def download(self, target):
 139.         # note that this does not update the stats_provider
 140.         data = IURI(self.uri).data
 141.         target.open(len(data))
 142.         target.write(data)
 143.         target.close()
 144.         return defer.maybeDeferred(target.finish)
 145. 
 146.     def download_to_data(self):
 147.         data = IURI(self.uri).data
 148.         return defer.succeed(data)