diff --git a/httpupload/httpupload.py b/httpupload/httpupload.py index e792e91..e5583a6 100644 --- a/httpupload/httpupload.py +++ b/httpupload/httpupload.py @@ -214,13 +214,13 @@ class Base(object): mime = 'application/octet-stream' # fallback mime type log.info("Detected MIME type of file: %s", mime) - progress_messages = Queue(8) - progress_window = ProgressWindow(_('HTTP Upload'), _('Requesting HTTP Upload Slot...'), - progress_messages, self.plugin, parent=chat_control.parent_win.window) + event = threading.Event() + progress = ProgressWindow( + self.plugin, chat_control.parent_win.window, event) file = File(path=path, size=size, mime=mime, encrypted=encrypted, key=key, iv=iv, control=chat_control, - progress=progress_window) + progress=progress, event=event) self.request_slot(file) def on_file_button_clicked(self, widget, jid, chat_control): @@ -287,7 +287,8 @@ class Base(object): def upload_file(self, file): - # progress_messages.put(_('Uploading file via HTTP...')) + GLib.idle_add(file.progress.label.set_text, + _('Uploading file via HTTP...')) try: headers = {'User-Agent': 'Gajim %s' % gajim.version, 'Content-Type': file.mime} @@ -344,6 +345,7 @@ class File: class StreamFileWithProgress: def __init__(self, file, mode, *args): + self.event = file.event self.backing = open(file.path, mode) self.encrypted_upload = file.encrypted self.backing.seek(0, os.SEEK_END) @@ -368,6 +370,8 @@ class StreamFileWithProgress: return self._total def read(self, size): + if self.event.isSet(): + raise UploadAbortedException if self.encrypted_upload: data = self.backing.read(size) if len(data) > 0: @@ -394,69 +398,49 @@ class StreamFileWithProgress: class ProgressWindow: - def __init__(self, title_text, during_text, messages_queue, plugin, parent): + def __init__(self, plugin, parent, event): self.plugin = plugin + self.event = event self.xml = gtkgui_helpers.get_gtk_builder(self.plugin.local_file_path('upload_progress_dialog.ui')) - self.messages_queue = messages_queue self.dialog = self.xml.get_object('progress_dialog') self.dialog.set_transient_for(parent) + self.dialog.set_title('HTTP Upload') self.label = self.xml.get_object('label') - self.cancel_button = self.xml.get_object('close_button') - self.label.set_markup('' + during_text + '') + self.label.set_text(_('Requesting HTTP Upload Slot...')) + # self.label.set_markup('' + during_text + '') self.progressbar = self.xml.get_object('progressbar') - self.progressbar.set_text("") - self.dialog.set_title(title_text) - #self.dialog.set_geometry_hints(min_width=400, min_height=96) - #self.dialog.set_position(Gtk.WIN_POS_CENTER_ON_PARENT) self.dialog.show_all() self.xml.connect_signals(self) - self.stopped = False - self.pulse_progressbar_timeout_id = GLib.timeout_add(100, self.pulse_progressbar) - self.process_messages_queue_timeout_id = GLib.timeout_add(100, self.process_messages_queue) - + self.pulse = GLib.timeout_add(100, self.pulse_progressbar) def pulse_progressbar(self): if self.dialog: self.progressbar.pulse() - return True # loop forever + return True return False - def process_messages_queue(self): - if not self.messages_queue.empty(): - self.label.set_markup('' + self.messages_queue.get() + '') - if self.dialog: - return True # loop forever - return False - - def on_progress_dialog_delete_event(self, widget, event): - self.stopped = True - if self.pulse_progressbar_timeout_id: - GLib.source_remove(self.pulse_progressbar_timeout_id) - GLib.source_remove(self.process_messages_queue_timeout_id) - - def on_cancel(self, widget): - self.stopped = True - if self.pulse_progressbar_timeout_id: - GLib.source_remove(self.pulse_progressbar_timeout_id) - GLib.source_remove(self.process_messages_queue_timeout_id) - self.dialog.destroy() + def on_destroy(self, *args): + self.event.set() + if self.pulse: + GLib.source_remove(self.pulse) def update_progress(self, seen, total): - if self.stopped == True: - raise - if self.pulse_progressbar_timeout_id: - GLib.source_remove(self.pulse_progressbar_timeout_id) - self.pulse_progressbar_timeout_id = None + if self.event.isSet(): + print('abort update progress') + return + if self.pulse: + GLib.source_remove(self.pulse) + self.pulse = None + print('remove') pct = (float(seen) / total) * 100.0 self.progressbar.set_fraction(float(seen) / total) self.progressbar.set_text(str(int(pct)) + "%") - log.debug('upload progress: %.2f%% (%d of %d bytes)' % (pct, seen, total)) - def close_dialog(self): - self.on_cancel(None) + def close_dialog(self, *args): + self.dialog.destroy() class UploadAbortedException(Exception): def __str__(self): - return "Upload Aborted" \ No newline at end of file + return "Upload Aborted" diff --git a/httpupload/upload_progress_dialog.ui b/httpupload/upload_progress_dialog.ui index b50c3c2..7c4f78c 100644 --- a/httpupload/upload_progress_dialog.ui +++ b/httpupload/upload_progress_dialog.ui @@ -1,13 +1,13 @@ - + - + True False upload-media dialog - + True @@ -25,7 +25,6 @@ False 2 4 - 0 3 @@ -35,7 +34,7 @@ True False True - + @@ -65,8 +64,10 @@ True False - 0 - True + + + +