def stop_transfer_op(self, op, by_sender=False, lost_connection=False): if op.direction == TransferDirection.TO_REMOTE_MACHINE: name = op.sender else: name = self.local_service_name if by_sender: op.file_send_cancellable.set() # If we stopped due to connection error, we don't want the message to be 'stopped by xx', # but just failed. if not lost_connection: print("stop transfer initiated by sender") if op.error_msg == "": op.set_status(OpStatus.STOPPED_BY_SENDER) else: op.set_status(OpStatus.FAILED) else: op.file_iterator.cancel() if not lost_connection: print("stop transfer initiated by receiver") if op.error_msg == "": op.set_status(OpStatus.STOPPED_BY_RECEIVER) else: op.set_status(OpStatus.FAILED) if not lost_connection: # We don't need to send this if it's a connection loss, the other end will handle # its own cleanup. opinfo = warp_pb2.OpInfo(timestamp=op.start_time, connect_name=name) self.stub.StopTransfer( warp_pb2.StopInfo(info=opinfo, error=op.error_msg != ""))
def cancel_transfer_op_request(self, op, by_sender=False): if op.direction == TransferDirection.TO_REMOTE_MACHINE: name = op.sender else: name = self.local_service_name self.stub.CancelTransferOpRequest( warp_pb2.OpInfo(timestamp=op.start_time, connect_name=name)) op.set_status(OpStatus.CANCELLED_PERMISSION_BY_SENDER if by_sender else OpStatus.CANCELLED_PERMISSION_BY_RECEIVER)
def start_transfer_op(self, op): logging.debug("Remote RPC: calling StartTransfer on '%s'" % (self.display_hostname)) start_time = GLib.get_monotonic_time() op.progress_tracker = transfers.OpProgressTracker(op) op.current_progress_report = None receiver = transfers.FileReceiver(op) op.set_status(OpStatus.TRANSFERRING) op.file_iterator = self.stub.StartTransfer( warp_pb2.OpInfo(timestamp=op.start_time, ident=self.local_ident, readable_name=util.get_hostname(), use_compression=op.use_compression and prefs.use_compression())) def report_receive_error(error): op.set_error(error) try: # If we leave an io stream open, it locks the location. For instance, # if this was a mounted location, we wouldn't be able to terminate until # we closed warp. if receiver.current_stream != None: receiver.current_stream.close() except GLib.Error: pass logging.critical("An error occurred receiving data from %s: %s" % (op.sender, op.error_msg)) op.set_status(OpStatus.FAILED) op.stop_transfer() try: for data in op.file_iterator: receiver.receive_data(data) except grpc.RpcError: if op.file_iterator.code() == grpc.StatusCode.CANCELLED: op.file_iterator = None return else: report_receive_error(op.file_iterator) return except Exception as e: report_receive_error(e) return op.file_iterator = None receiver.receive_finished() logging.debug("Remote: receipt of %s files (%s) finished in %s" % \ (op.total_count, GLib.format_size(op.total_size),\ util.precise_format_time_span(GLib.get_monotonic_time() - start_time))) op.set_status(OpStatus.FINISHED)
def cancel_transfer_op_request(self, op, by_sender=False): logging.debug("Remote RPC: calling CancelTransferOpRequest on '%s'" % (self.display_hostname)) if op.direction == TransferDirection.TO_REMOTE_MACHINE: name = op.sender else: name = self.local_ident self.stub.CancelTransferOpRequest( warp_pb2.OpInfo(timestamp=op.start_time, ident=name, readable_name=util.get_hostname())) op.set_status(OpStatus.CANCELLED_PERMISSION_BY_SENDER if by_sender else OpStatus.CANCELLED_PERMISSION_BY_RECEIVER)
def send_transfer_op_request(self, op): if not self.stub: # short circuit for testing widgets return transfer_op = warp_pb2.TransferOpRequest( info=warp_pb2.OpInfo(ident=op.sender, timestamp=op.start_time), sender_name=op.sender_name, receiver=self.ident, size=op.total_size, count=op.total_count, name_if_single=op.description, mime_if_single=op.mime_if_single, top_dir_basenames=op.top_dir_basenames) self.stub.ProcessTransferOpRequest(transfer_op)
def send_transfer_op_request(self, op): if not self.stub: # short circuit for testing widgets return logging.debug("Remote RPC: calling TransferOpRequest on '%s'" % (self.display_hostname)) transfer_op = warp_pb2.TransferOpRequest( info=warp_pb2.OpInfo(ident=op.sender, timestamp=op.start_time, readable_name=util.get_hostname()), sender_name=op.sender_name, receiver=self.ident, size=op.total_size, count=op.total_count, name_if_single=op.description, mime_if_single=op.mime_if_single, top_dir_basenames=op.top_dir_basenames) self.stub.ProcessTransferOpRequest(transfer_op)
def stop_transfer_op(self, op, by_sender=False, lost_connection=False): logging.debug("Remote RPC: Calling StopTransfer on '%s'" % (self.display_hostname)) if op.direction == TransferDirection.TO_REMOTE_MACHINE: name = op.sender else: name = self.local_ident if by_sender: op.file_send_cancellable.set() # If we stopped due to connection error, we don't want the message to be 'stopped by xx', # but just failed. if not lost_connection: logging.debug("Remote: stop transfer initiated by sender") if op.error_msg == "": op.set_status(OpStatus.STOPPED_BY_SENDER) else: op.set_status(OpStatus.FAILED) else: if op.file_iterator: op.file_iterator.cancel() if not lost_connection: logging.debug("Remote: stop transfer initiated by receiver") if op.error_msg == "": op.set_status(OpStatus.STOPPED_BY_RECEIVER) else: op.set_status(OpStatus.FAILED) if not lost_connection: # We don't need to send this if it's a connection loss, the other end will handle # its own cleanup. opinfo = warp_pb2.OpInfo(timestamp=op.start_time, ident=name, readable_name=util.get_hostname()) self.stub.StopTransfer( warp_pb2.StopInfo(info=opinfo, error=op.error_msg != ""))