Skip to content
Snippets Groups Projects
file_props.py 4.55 KiB
Newer Older
zimio's avatar
zimio committed
"""
This module is in charge of taking care of all the infomation related to
individual files. Files are identified by the account name and its sid.


>>> print FilesProp.getFileProp('jabberid', '10')
None
>>> fp = FilesProp()
Traceback (most recent call last):
    ...
Exception: this class should not be instatiated
>>> print FilesProp.getAllFileProp()
[]
>>> fp = FilesProp.getNewFileProp('jabberid', '10')
>>> fp2 = FilesProp.getFileProp('jabberid', '10')
>>> fp == fp2
True
"""

class FilesProp:
    _files_props = {}

    def __init__(self):
        raise Exception('this class should not be instatiated')

    @classmethod
    def getNewFileProp(cls, account, sid):
        fp = FileProp(account, sid)
        cls.setFileProp(fp, account, sid)
        return fp

    @classmethod
    def getFileProp(cls, account, sid):
        if (account, sid) in cls._files_props.keys():
            return cls._files_props[account, sid]

    @classmethod
    def getFilePropByAccount(cls, account):
        # Returns a list of file_props in one account
        file_props = []
        for account, sid in cls._files_props:
            if account == account:
                file_props.append(cls._files_props[account, sid])
        return file_props

    @classmethod
    def getFilePropByType(cls, type_, sid):
        # This method should be deleted. Getting fileprop by type and sid is not
        # unique enough. More than one fileprop might have the same type and sid
        files_prop = cls.getAllFileProp()
        for fp in files_prop:
            if fp.type_ == type_ and fp.sid == sid:
                return fp

    @classmethod
    def getFilePropBySid(cls, sid):
        # This method should be deleted. It is kept to make things compatible
        # This method should be replaced and instead get the file_props by
        # account and sid
        files_prop = cls.getAllFileProp()
        for fp in files_prop:
            if fp.sid == sid:
                return fp

    @classmethod
    def getAllFileProp(cls):
        return cls._files_props.values()

    @classmethod
    def setFileProp(cls, fp, account, sid):
        cls._files_props[account, sid] = fp

    @classmethod
    def deleteFileProp(cls, file_prop):
        files_props = cls._files_props
        a = s = None
        for account, sid in files_props:
            fp = files_props[account, sid]
            if fp is file_prop:
                a = account
                s = sid
        if a != None and s != None:
            del files_props[a, s]


class FileProp(object):

    def __init__(self, account, sid):
        # Do not instatiate this class directly. Call FilesProp.getNeFileProp
        # instead
        self.streamhosts = []
        self.transfered_size = []
        self.started = False
        self.completed = False
        self.paused = False
        self.stalled = False
        self.connected = False
        self.stopped = False
        self.is_a_proxy = False
        self.proxyhost = None
        self.proxy_sender = None
        self.proxy_receiver = None
        self.streamhost_used = None
        # method callback called in case of transfer failure
        self.failure_cb = None
        # method callback called when disconnecting
        self.disconnect_cb = None
        self.continue_cb = None
        self.sha_str = None
        # transfer type: 's' for sending and 'r' for receiving
        self.type_ = None
        self.error = None
        self.elapsed_time = None
        self.last_time = None
        self.received_len = None
        # full file path
        self.file_name = None
        self.name = None
        self.file_desc = None
        self.offset = None
        self.sender = None
        self.receiver = None
        self.tt_account = None
        self.size = None
        self._sid = sid
        self.account = account
        self.mime_type = None
        self.algo = None
        self.direction = None
        self.syn_id = None
        self.seq = None
        self.hash_ = None
        self.session_sid = None
        self.fd = None
        self.startexmpp = None
        self.session_type = None
zimio's avatar
zimio committed
        self.request_id = None
Yann Leboulanger's avatar
Yann Leboulanger committed
        self.proxyhosts = None
zimio's avatar
zimio committed

    def getsid(self):
        # Getter of the property sid
        return self._sid

    def setsid(self, value):
        # The sid value will change
        # we need to change the in _files_props key as well
        del FilesProp._files_props[self.account, self._sid]
        self._sid = value
        FilesProp._files_props[self.account, self._sid] = self

    sid = property(getsid, setsid)

if __name__ == "__main__":
    import doctest
    doctest.testmod()