tahoe-lafs/src/allmydata/filenode.py

99 lines
2.5 KiB
Python

from zope.interface import implements
from twisted.internet import defer
from allmydata.interfaces import IFileNode, IFileURI, IURI
from allmydata import uri
class FileNode:
implements(IFileNode)
def __init__(self, uri, client):
u = IFileURI(uri)
self.uri = u.to_string()
self._client = client
def get_uri(self):
return self.uri
def is_readonly(self):
return True
def get_readonly_uri(self):
return self.uri
def get_size(self):
return IFileURI(self.uri).get_size()
def __hash__(self):
return hash((self.__class__, self.uri))
def __cmp__(self, them):
if cmp(type(self), type(them)):
return cmp(type(self), type(them))
if cmp(self.__class__, them.__class__):
return cmp(self.__class__, them.__class__)
return cmp(self.uri, them.uri)
def get_verifier(self):
return IFileURI(self.uri).get_verifier()
def check(self):
verifier = self.get_verifier()
return self._client.getServiceNamed("checker").check(verifier)
def download(self, target):
downloader = self._client.getServiceNamed("downloader")
return downloader.download(self.uri, target)
def download_to_data(self):
downloader = self._client.getServiceNamed("downloader")
return downloader.download_to_data(self.uri)
class LiteralFileNode:
implements(IFileNode)
def __init__(self, my_uri, client):
u = IFileURI(my_uri)
assert isinstance(u, uri.LiteralFileURI)
self.uri = u.to_string()
self._client = client
def get_uri(self):
return self.uri
def is_readonly(self):
return True
def get_readonly_uri(self):
return self.uri
def get_size(self):
return len(IURI(self.uri).data)
def __hash__(self):
return hash((self.__class__, self.uri))
def __cmp__(self, them):
if cmp(type(self), type(them)):
return cmp(type(self), type(them))
if cmp(self.__class__, them.__class__):
return cmp(self.__class__, them.__class__)
return cmp(self.uri, them.uri)
def get_verifier(self):
return None
def check(self):
return None
def download(self, target):
data = IURI(self.uri).data
target.open(len(data))
target.write(data)
target.close()
return defer.maybeDeferred(target.finish)
def download_to_data(self):
data = IURI(self.uri).data
return defer.succeed(data)