Ticket #4242: filetransfer.diff

File filetransfer.diff, 5.4 KB (added by humitos, 11 years ago)

Candidate. It makes Sugar to crash because of a Segmentation Fault that must be solved. I'm researching about this

  • src/jarabe/model/filetransfer.py

    diff --git a/src/jarabe/model/filetransfer.py b/src/jarabe/model/filetransfer.py
    index 820df74..831c1e1 100644
    a b import socket 
    2020
    2121from gi.repository import GObject
    2222from gi.repository import Gio
     23from gi.repository import GLib
    2324import dbus
    2425from telepathy.interfaces import CONNECTION_INTERFACE_REQUESTS, CHANNEL
    2526from telepathy.constants import CONNECTION_HANDLE_TYPE_CONTACT,     \
    from sugar3 import dispatch 
    3334from jarabe.util.telepathy import connection_watcher
    3435from jarabe.model import neighborhood
    3536
     37# Avoid "Fatal Python error: GC object already tracked"
     38# http://stackoverflow.com/questions/7496629/gstreamer-appsrc-causes-random-crashes
     39GObject.threads_init()
    3640
    3741FT_STATE_NONE = 0
    3842FT_STATE_PENDING = 1
    class StreamSplicer(GObject.GObject): 
    7377        self._pending_buffers = []
    7478
    7579    def start(self):
    76         self._input_stream.read_async(self._CHUNK_SIZE, self.__read_async_cb,
    77                                       GObject.PRIORITY_LOW)
     80        self._input_stream.read_async(
     81            self._pending_buffers, self._CHUNK_SIZE, GLib.PRIORITY_LOW,
     82            None, self.__read_async_cb, 'user_data arg')
    7883
    79     def __read_async_cb(self, input_stream, result):
     84    def __read_async_cb(self, input_stream, result, user_data):
     85        print user_data
    8086        data = input_stream.read_finish(result)
    8187
    8288        if not data:
    8389            logging.debug('closing input stream')
    84             self._input_stream.close()
     90            self._input_stream.close(None)
    8591        else:
    8692            self._pending_buffers.append(data)
    87             self._input_stream.read_async(self._CHUNK_SIZE,
    88                                             self.__read_async_cb,
    89                                             GObject.PRIORITY_LOW)
     93            self._input_stream.read_async(
     94                self._pending_buffers, self._CHUNK_SIZE, GLib.PRIORITY_LOW,
     95                None, self.__read_async_cb, 'user_data_arg2')
    9096        self._write_next_buffer()
    9197
    9298    def __write_async_cb(self, output_stream, result, user_data):
     99        print user_data
    93100        count_ = output_stream.write_finish(result)
    94101
    95102        if not self._pending_buffers and \
    96103                not self._output_stream.has_pending() and \
    97104                not self._input_stream.has_pending():
    98105            logging.debug('closing output stream')
    99             output_stream.close()
     106            output_stream.close(None)
    100107            self.emit('finished')
    101108        else:
    102109            self._write_next_buffer()
    class StreamSplicer(GObject.GObject): 
    106113            data = self._pending_buffers.pop(0)
    107114            # TODO: we pass the buffer as user_data because of
    108115            # http://bugzilla.gnome.org/show_bug.cgi?id=564102
    109             self._output_stream.write_async(data, self.__write_async_cb,
    110                                             GObject.PRIORITY_LOW,
    111                                             user_data=data)
     116            self._output_stream.write_async(
     117                data, self._CHUNK_SIZE, GLib.PRIORITY_LOW, None,
     118                self.__write_async_cb, 'user_data_arg3')
    112119
    113120
    114121class BaseFileTransfer(GObject.GObject):
    class IncomingFileTransfer(BaseFileTransfer): 
    215222            # close the fd when it goes out of scope
    216223            self._socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
    217224            self._socket.connect(self._socket_address)
    218             input_stream = Gio.unix.InputStream(self._socket.fileno(), True)
     225            input_stream = Gio.UnixInputStream.new(self._socket.fileno(), True)
    219226
    220             destination_file = Gio.File(self.destination_path)
     227            destination_file = Gio.File.new_for_path(self.destination_path)
    221228            if self.initial_offset == 0:
    222                 output_stream = destination_file.create()
     229                output_stream = destination_file.create(
     230                    Gio.FileCreateFlags.PRIVATE, None)
    223231            else:
    224232                output_stream = destination_file.append_to()
    225233
    class OutgoingFileTransfer(BaseFileTransfer): 
    277285            # closes the fd when it goes out of scope
    278286            self._socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
    279287            self._socket.connect(self._socket_address)
    280             output_stream = Gio.unix.OutputStream(self._socket.fileno(), True)
     288            output_stream = Gio.UnixOutputStream.new(
     289                self._socket.fileno(), True)
    281290
    282291            logging.debug('opening %s for reading', self._file_name)
    283             input_stream = Gio.File(self._file_name).read()
     292            input_stream = Gio.File.new_for_path(self._file_name).read(None)
    284293            if self.initial_offset > 0:
    285294                input_stream.skip(self.initial_offset)
    286295
    def file_transfer_available(): 
    356365if __name__ == '__main__':
    357366    import tempfile
    358367
    359     test_file_name = '/home/tomeu/isos/Soas2-200904031934.iso'
    360     test_input_stream = Gio.File(test_file_name).read()
    361     test_output_stream = Gio.File(tempfile.mkstemp()[1]).append_to()
     368    test_file_name = '/home/humitos/test.py'
     369    test_input_stream = Gio.File.new_for_path(test_file_name).read(None)
     370    test_output_stream = Gio.File.new_for_path(
     371        tempfile.mkstemp()[1]).append_to(Gio.FileCreateFlags.PRIVATE, None)
    362372
    363373    # TODO: Use splice_async when it gets implemented
    364374    splicer = StreamSplicer(test_input_stream, test_output_stream)