From cc1c4904e20f862c9c22cdf79a0a13c8fd7ce13a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=92=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=B8=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= Date: Wed, 16 Mar 2016 23:11:18 +0300 Subject: [PATCH] transfers init --- src/file_transfers.py | 44 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/file_transfers.py b/src/file_transfers.py index 9d4995b..486410e 100644 --- a/src/file_transfers.py +++ b/src/file_transfers.py @@ -1,2 +1,46 @@ # TODO: add support of file transfers # TODO: add support of avatars +from toxcore_enums_and_consts import TOX_FILE_KIND +from os.path import basename, getsize + + +class FileTransfer(object): + def __init__(self, path, tox, friend_number): + self._path = path + self._tox = tox + self._friend_number = friend_number + + def set_tox(self, tox): + self._tox = tox + + +class SendTransfer(FileTransfer): + def __init__(self, path, tox, friend_number): + super(self.__class__, self).__init__(path, tox, friend_number) + self._file_number = tox.file_send(friend_number, TOX_FILE_KIND['DATA'], getsize(path), None, basename(path)) + + def get_file_number(self): + return self._file_number + + def send_chunk(self, position, size): + with open(self._path) as f: + f.seek(position) + data = f.read(size) + return self._tox.file_send_chunk(self._friend_number, self._file_number, position, data) + + +class ReceiveTransfer(FileTransfer): + def __init__(self, path, tox, friend_number): + super(self.__class__, self).__init__(path, tox, friend_number) + + def write_chunk(self, position, data): + size = getsize(self._path) + if size < position + len(data): + with open(self._path, 'w') as f: + f.write('\0' * (position + len(data) - size)) + f.seek(position) + f.write(data) + else: + with open(self._path, 'w') as f: + f.seek(position) + f.write(data)