diff --git a/data/interface/werror.ui b/data/interface/werror.ui new file mode 100644 index 0000000..7cd3e4a --- /dev/null +++ b/data/interface/werror.ui @@ -0,0 +1,136 @@ + + + + + + + 640 + 240 + False + True + center + dialog + + + False + vertical + 2 + + + False + center + + + gtk-ok + True + True + True + True + + + False + True + 0 + + + + + False + True + end + 0 + + + + + True + False + vertical + + + True + False + There was an error while creating the disc. + + + True + True + 0 + + + + + True + True + True + + + True + False + vertical + + + 200 + True + True + in + + + True + True + debug_buffer + + + + + False + True + 0 + + + + + gtk-copy + True + True + True + True + + + + False + True + 1 + + + + + + + True + False + Debugging data + start + + + + + False + True + 1 + + + + + True + True + 1 + + + + + + button1 + + + diff --git a/src/devede/error.py b/src/devede/error.py new file mode 100644 index 0000000..d52056f --- /dev/null +++ b/src/devede/error.py @@ -0,0 +1,47 @@ +# Copyright 2014 (C) Raster Software Vigo (Sergio Costas) +# +# This file is part of DeVeDe-NG +# +# DeVeDe-NG is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# DeVeDe-NG is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see + +from gi.repository import Gtk,Gdk +import os +import devede.configuration_data + +class error_window: + + def __init__(self): + + self.config = devede.configuration_data.configuration.get_config() + + builder = Gtk.Builder() + builder.set_translation_domain(self.config.gettext_domain) + + builder.add_from_file(os.path.join(self.config.glade,"werror.ui")) + builder.connect_signals(self) + werror_window = builder.get_object("dialog_error") + wdebug_buffer = builder.get_object("debug_buffer") + wdebug_buffer.insert_at_cursor(self.config.get_log()) + + werror_window.show_all() + werror_window.run() + werror_window.destroy() + + + def on_copy_clicked(self,b): + + clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) + data =self.config.get_log() + clipboard.set_text(data,len(data)) + return diff --git a/src/devede/executor.py b/src/devede/executor.py index cc2b457..ab8fe94 100644 --- a/src/devede/executor.py +++ b/src/devede/executor.py @@ -45,6 +45,7 @@ class executor(GObject.GObject): self.dependencies = None self.childs = [] self.progress_bar = None + self.killed = False def add_dependency(self, dep): @@ -131,6 +132,7 @@ class executor(GObject.GObject): else: self.handle = subprocess.Popen(command,stdout = subprocess.PIPE, stderr = subprocess.PIPE) except Exception as error_launch: + self.handle = None self.stderr_data += str(error_launch) self.wait_end() return @@ -148,6 +150,7 @@ class executor(GObject.GObject): self.channel_stderr.add_watch(GLib.IO_IN | GLib.IO_HUP,self.read_stderr) else: (stdout_r, stderr_r) = self.handle.communicate() + self.handle = None self.config.append_log(self.launch_command) try: self.config.append_log(stdout_r.decode("utf-8")) @@ -158,7 +161,6 @@ class executor(GObject.GObject): except: self.config.append_log(stderr_r.decode("latin-1")) return (stdout_r, stderr_r) - def read_stdout_to_file(self,source,condition): @@ -244,17 +246,24 @@ class executor(GObject.GObject): if self.handle==None: return + self.killed = True os.kill(self.handle.pid,signal.SIGKILL) def wait_end(self): - self.config.append_log(self.text) - self.config.append_log(self.launch_command) - self.config.append_log(self.stdout_data) - self.config.append_log(self.stderr_data) if self.handle != None: retval = self.handle.wait() + self.handle = None else: retval = -1 + + if self.killed: + retval = 0 + else: + self.config.append_log(self.text) + self.config.append_log(self.launch_command) + self.config.append_log(self.stdout_data) + self.config.append_log(self.stderr_data) + self.emit("ended",retval) \ No newline at end of file diff --git a/src/devede/project.py b/src/devede/project.py index 052753c..4f36856 100644 --- a/src/devede/project.py +++ b/src/devede/project.py @@ -177,7 +177,6 @@ class devede_project: ask = devede.ask.ask_window() if (ask.run(_("Abort the current DVD and exit?"),_("Exit DeVeDe"))): - print(self.config.get_log()) Gtk.main_quit() return True @@ -276,4 +275,10 @@ class devede_project: p = movie.do_conversion(os.path.join(movie_folder,"movie_"+str(counter)+".mpg")) run_window.add_process(p) counter += 1 - run_window.run() \ No newline at end of file + run_window.connect("done",self.disc_done) + self.wmain_window.hide() + run_window.run() + + def disc_done(self,object,value): + + self.wmain_window.show() \ No newline at end of file diff --git a/src/devede/runner.py b/src/devede/runner.py index 36229f9..c0374cf 100644 --- a/src/devede/runner.py +++ b/src/devede/runner.py @@ -18,11 +18,16 @@ from gi.repository import Gtk,GObject import os import devede.configuration_data +import devede.error class runner(GObject.GObject): + __gsignals__ = {'done': (GObject.SIGNAL_RUN_FIRST, None,(int,))} + def __init__(self): + GObject.GObject.__init__(self) + self.config = devede.configuration_data.configuration.get_config() if (self.config.multicore): self.count_cores() @@ -81,7 +86,10 @@ class runner(GObject.GObject): if (line.startswith("processor")): self.cores += 1 - def run(self): + def run(self, clear_log = True): + + if clear_log: + self.config.clear_log() for element in self.proc_list: # each element has three items: @@ -100,8 +108,17 @@ class runner(GObject.GObject): break self.wtotal.set_text(str(self.total_processes - len(self.proc_list))+"/"+str(self.total_processes)) + def process_ended(self,process, retval): + if retval != 0: + for element in self.proc_list: + element.cancel() + self.wprogress.destroy() + devede.error.error_window() + self.emit("done",1) + return + # move the progress bar used by this process to the list of available progress bars tmp = [] for e in self.used_progress_bars: @@ -122,6 +139,7 @@ class runner(GObject.GObject): # launch a new process if (len(self.proc_list) != 0): - self.run() + self.run(False) else: - self.wprogress.destroy() \ No newline at end of file + self.wprogress.destroy() + self.emit("done",0) \ No newline at end of file