file control callback added, screenshots added
This commit is contained in:
parent
779e81acb9
commit
2e333085f0
4 changed files with 51 additions and 8 deletions
|
@ -177,8 +177,8 @@ def file_chunk_request(tox, friend_number, file_number, position, size, user_dat
|
||||||
|
|
||||||
|
|
||||||
def file_recv_control(tox, friend_number, file_number, file_control, user_data):
|
def file_recv_control(tox, friend_number, file_number, file_control, user_data):
|
||||||
# TODO: process
|
if file_control == TOX_FILE_CONTROL['CANCEL']:
|
||||||
pass
|
Profile.get_instance().cancel_transfer(friend_number, file_number, True)
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------------------------------------------
|
||||||
# Callbacks - initialization
|
# Callbacks - initialization
|
||||||
|
|
|
@ -50,6 +50,10 @@ class FileTransfer(QtCore.QObject):
|
||||||
self._file.close()
|
self._file.close()
|
||||||
self._state_changed.signal.emit(self.state, self._done / self._size)
|
self._state_changed.signal.emit(self.state, self._done / self._size)
|
||||||
|
|
||||||
|
def cancelled(self):
|
||||||
|
self._file.close()
|
||||||
|
self._state_changed.signal.emit(TOX_FILE_CONTROL['CANCEL'], self._done / self._size)
|
||||||
|
|
||||||
def send_control(self, control):
|
def send_control(self, control):
|
||||||
if self._tox.file_control(self._friend_number, self._file_number, control):
|
if self._tox.file_control(self._friend_number, self._file_number, control):
|
||||||
self.state = control
|
self.state = control
|
||||||
|
@ -62,6 +66,10 @@ class FileTransfer(QtCore.QObject):
|
||||||
# TODO implement or not implement
|
# TODO implement or not implement
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------------------------------------------
|
||||||
|
# Send file
|
||||||
|
# -----------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
class SendTransfer(FileTransfer):
|
class SendTransfer(FileTransfer):
|
||||||
|
|
||||||
|
@ -99,6 +107,28 @@ class SendAvatar(SendTransfer):
|
||||||
super(SendAvatar, self).__init__(path, tox, friend_number, TOX_FILE_KIND['AVATAR'], hash)
|
super(SendAvatar, self).__init__(path, tox, friend_number, TOX_FILE_KIND['AVATAR'], hash)
|
||||||
|
|
||||||
|
|
||||||
|
class SendFromBuffer(FileTransfer):
|
||||||
|
|
||||||
|
def __init__(self, tox, friend_number, data, file_name):
|
||||||
|
super(SendFromBuffer, self).__init__(None, tox, friend_number, len(data))
|
||||||
|
self._data = data
|
||||||
|
self._file_number = tox.file_send(friend_number, TOX_FILE_KIND['DATA'], len(data), None, file_name)
|
||||||
|
|
||||||
|
def send_chunk(self, position, size):
|
||||||
|
if size:
|
||||||
|
data = self._data[position:position + size]
|
||||||
|
self._tox.file_send_chunk(self._friend_number, self._file_number, position, data)
|
||||||
|
self._done += size
|
||||||
|
self._state_changed.signal.emit(self.state, self._done / self._size)
|
||||||
|
else:
|
||||||
|
self.state = TOX_FILE_TRANSFER_STATE['FINISHED']
|
||||||
|
self._state_changed.signal.emit(self.state, 1)
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------------------------------------------
|
||||||
|
# Receive file
|
||||||
|
# -----------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
class ReceiveTransfer(FileTransfer):
|
class ReceiveTransfer(FileTransfer):
|
||||||
|
|
||||||
def __init__(self, path, tox, friend_number, size, file_number):
|
def __init__(self, path, tox, friend_number, size, file_number):
|
||||||
|
|
|
@ -298,7 +298,6 @@ class MainWindow(QtGui.QMainWindow):
|
||||||
self.profile.send_file(name[0])
|
self.profile.send_file(name[0])
|
||||||
|
|
||||||
def send_screenshot(self):
|
def send_screenshot(self):
|
||||||
# TODO: add screenshots support
|
|
||||||
if self.profile.is_active_online(): # active friend exists and online
|
if self.profile.is_active_online(): # active friend exists and online
|
||||||
self.sw = ScreenShotWindow()
|
self.sw = ScreenShotWindow()
|
||||||
self.sw.show()
|
self.sw.show()
|
||||||
|
@ -375,7 +374,7 @@ class MainWindow(QtGui.QMainWindow):
|
||||||
|
|
||||||
|
|
||||||
class ScreenShotWindow(QtGui.QWidget):
|
class ScreenShotWindow(QtGui.QWidget):
|
||||||
# TODO: send raw data and make window semi-transparent
|
# TODO: make window semi-transparent
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ScreenShotWindow, self).__init__()
|
super(ScreenShotWindow, self).__init__()
|
||||||
self.rubberband = QtGui.QRubberBand(QtGui.QRubberBand.Rectangle, self)
|
self.rubberband = QtGui.QRubberBand(QtGui.QRubberBand.Rectangle, self)
|
||||||
|
@ -407,8 +406,11 @@ class ScreenShotWindow(QtGui.QWidget):
|
||||||
rect.y(),
|
rect.y(),
|
||||||
rect.width(),
|
rect.width(),
|
||||||
rect.height())
|
rect.height())
|
||||||
image = p.toImage()
|
byte_array = QtCore.QByteArray()
|
||||||
print len(image.bits())
|
buffer = QtCore.QBuffer(byte_array)
|
||||||
|
buffer.open(QtCore.QIODevice.WriteOnly)
|
||||||
|
p.save(buffer, 'PNG')
|
||||||
|
Profile.get_instance().send_screenshot(''.join(byte_array[i] for i in xrange(byte_array.length())))
|
||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -736,15 +736,19 @@ class Profile(Contact, Singleton):
|
||||||
friend = self.get_friend_by_number(friend_number)
|
friend = self.get_friend_by_number(friend_number)
|
||||||
if settings['allow_auto_accept'] and friend.tox_id in settings['auto_accept_from_friends']:
|
if settings['allow_auto_accept'] and friend.tox_id in settings['auto_accept_from_friends']:
|
||||||
path = settings['auto_accept_path'] or curr_directory()
|
path = settings['auto_accept_path'] or curr_directory()
|
||||||
|
# TODO: check if file exists
|
||||||
item = self.create_file_transfer_item(file_name.decode('utf-8'), size, friend_number, file_number, False)
|
item = self.create_file_transfer_item(file_name.decode('utf-8'), size, friend_number, file_number, False)
|
||||||
self.accept_transfer(item, path + '/' + file_name.decode('utf-8'), friend_number, file_number)
|
self.accept_transfer(item, path + '/' + file_name.decode('utf-8'), friend_number, file_number)
|
||||||
else:
|
else:
|
||||||
self.create_file_transfer_item(file_name.decode('utf-8'), size, friend_number, file_number, True)
|
self.create_file_transfer_item(file_name.decode('utf-8'), size, friend_number, file_number, True)
|
||||||
|
|
||||||
def cancel_transfer(self, friend_number, file_number):
|
def cancel_transfer(self, friend_number, file_number, already_cancelled=False):
|
||||||
if (friend_number, file_number) in self._file_transfers:
|
if (friend_number, file_number) in self._file_transfers:
|
||||||
tr = self._file_transfers[(friend_number, file_number)]
|
tr = self._file_transfers[(friend_number, file_number)]
|
||||||
tr.cancel()
|
if not already_cancelled:
|
||||||
|
tr.cancel()
|
||||||
|
else:
|
||||||
|
tr.cancelled()
|
||||||
del self._file_transfers[(friend_number, file_number)]
|
del self._file_transfers[(friend_number, file_number)]
|
||||||
|
|
||||||
def accept_transfer(self, item, path, friend_number, file_number, size):
|
def accept_transfer(self, item, path, friend_number, file_number, size):
|
||||||
|
@ -783,6 +787,13 @@ class Profile(Contact, Singleton):
|
||||||
sa = SendAvatar(avatar_path, self._tox, friend_number)
|
sa = SendAvatar(avatar_path, self._tox, friend_number)
|
||||||
self._file_transfers[(friend_number, sa.get_file_number())] = sa
|
self._file_transfers[(friend_number, sa.get_file_number())] = sa
|
||||||
|
|
||||||
|
def send_screenshot(self, data):
|
||||||
|
friend_number = self.get_active_number()
|
||||||
|
st = SendFromBuffer(self._tox, friend_number, data, 'toxygen_inline.png')
|
||||||
|
self._file_transfers[(friend_number, st.get_file_number())] = st
|
||||||
|
item = self.create_file_transfer_item('toxygen_inline.png', len(data), friend_number, st.get_file_number(), False)
|
||||||
|
st.set_state_changed_handler(item.update)
|
||||||
|
|
||||||
def send_file(self, path):
|
def send_file(self, path):
|
||||||
friend_number = self.get_active_number()
|
friend_number = self.get_active_number()
|
||||||
st = SendTransfer(path, self._tox, friend_number)
|
st = SendTransfer(path, self._tox, friend_number)
|
||||||
|
|
Loading…
Reference in a new issue