Beispiel #1
0
    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 != ""))
Beispiel #2
0
 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)
Beispiel #3
0
    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)
Beispiel #4
0
    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)
Beispiel #5
0
    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)
Beispiel #6
0
    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)
Beispiel #7
0
    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 != ""))