示例#1
0
    def dialogo_cancelacion(self, widget):
        """Muestra el cuadro diálogo de cancelación del proceso."""
        # crear
        cancelar = gtk.Dialog(_("Alerta"), self.window, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
                     (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT, gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT))
        logo = gtk.Image()
        logo.set_from_stock(gtk.STOCK_DIALOG_QUESTION, 6)
        icon = cancelar.render_icon(gtk.STOCK_DIALOG_QUESTION, 1)
        cancelar.set_icon(icon)
        if self.working:
            self.pause = True
            pregunta = gtk.Label(_("¿Está seguro que desea detener el proceso de migración?"))
        else:
            pregunta = gtk.Label(_("¿Está seguro que desea salir del asistente de migración?"))
        cancelar.set_default_response(gtk.RESPONSE_REJECT)
        h1 = gtk.HBox(False, 10)

        # añadir
        h1.pack_start(logo, True, False, 10)
        h1.pack_start(pregunta, True, False, 10)
        cancelar.vbox.pack_start(h1, True, False, 10)

        #mostrar
        cancelar.show_all()
        response = cancelar.run()
        cancelar.destroy()
        if response == gtk.RESPONSE_ACCEPT:
            self.destroy(None)
        else:
            self.pause = False
示例#2
0
 def about(self, widget):
     dialog = gtk.AboutDialog()
     dialog.set_name("AMIGU")
     dialog.set_version(ver)
     dialog.set_copyright("Elaborado el 30/07/2014 DIRECTIVA FUNDACITIOS JJAM")
     dialog.set_website(self.url)
     dialog.set_website_label(self.url)
     dialog.set_authors([
         _("Programadores") + ':',
         'Emilia Abad Sánchez <email>\n',
         'Fernando Ruiz Humanes <email>\n'
         #_('Contributors:'), # FIXME: remove ":"
     ])
     dialog.set_artists([_("Diseñadora gráfica") + ':',
         'Emilia Abad Sánchez <email>\n',
         _("Logo e icono") + " por Sadesi"
     ])
     dialog.set_translator_credits(_("Este programa aún no ha sido traducido a otros idiomas"))
     logo_file = os.path.abspath(os.path.join(dir_imagenes, 'icon_paginacion.png'))
     logo = gtk.gdk.pixbuf_new_from_file(logo_file)
     dialog.set_logo(logo)
     if os.path.isfile('/usr/share/common-licenses/GPL'):
         dialog.set_license(open('/usr/share/common-licenses/GPL').read())
     else:
         dialog.set_license("This program is released under the GNU General Public License.\nPlease visit http://www.gnu.org/copyleft/gpl.html for details.")
     dialog.set_comments(_("asistente a la migración de Canaima"))
     dialog.run()
     dialog.destroy()
示例#3
0
    def excepthook(self, exctype, excvalue, exctb):
        """Manejador de excepciones"""
        if issubclass(exctype, KeyboardInterrupt) or issubclass(exctype, SystemExit):
            return
        tbtext = "".join(traceback.format_exception(exctype, excvalue, exctb))
        syslog.syslog(syslog.LOG_ERR, "Exception in GTK frontend (invoking crash handler):")
        for line in tbtext.split("\n"):
            syslog.syslog(syslog.LOG_ERR, line)
        print >> sys.stderr, ("Exception in GTK frontend (invoking crash handler):")
        print >> sys.stderr, tbtext

        # self.dialogo_error(tbtext)
        if os.path.exists("/usr/share/apport/apport-gtk"):
            self.previous_excepthook(exctype, excvalue, exctb)
        tbtext = (
            _("Se ha producido un error durante la ejecucción del programa que impide continuar.")
            + _(
                "Si dicho fallo se repite por favor comuníquelo al equipo de desarrolladores adjuntando el siguiente error:"
            )
            + "\n\n"
            + tbtext
        )
        error_dlg = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, message_format=tbtext, buttons=gtk.BUTTONS_CLOSE)
        error_dlg.run()
        error_dlg.destroy()
        self.destroy(None)
        sys.exit(1)
示例#4
0
    def dialogo_confirmacion(self, widget):
        """Muestra el diálogo de confirmación antes de empezar la migración"""
        # crear
        confirmar = gtk.Dialog(_("Confirmación"), self.window, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
                     (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT, gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT))
        logo = gtk.Image()
        logo.set_from_stock(gtk.STOCK_DIALOG_QUESTION, 6)
        icon = confirmar.render_icon(gtk.STOCK_DIALOG_QUESTION, 1)
        confirmar.set_icon(icon)
        pregunta = gtk.Label(_('El asistente ha reunido la información necesaria para realizar la migración.') + '\n' + _('Es aconsejable cerrar todas las aplicaciones antes continuar.') + '\n' + _('¿Desea comenzar la copia de archivos/configuraciones?'))

        h1 = gtk.HBox(False, 10)

        # añadir
        h1.pack_start(logo, True, False, 10)
        h1.pack_start(pregunta, True, False, 10)

        confirmar.vbox.pack_start(h1, True, False, 10)

        # mostrar
        confirmar.show_all()
        response  = confirmar.run()
        confirmar.destroy()
        if response == gtk.RESPONSE_ACCEPT:
            self.etapa_siguiente(None)
示例#5
0
 def initialize(self):
     self.name = _('Contactos de Windows')
     self.description = _('Contactos de Windows')
     self.size = 0.0
     self.cs = glob.glob(join(self.user.path, 'Contacts','*.contact'))
     if not self.cs:
         raise Exception
     for c in self.cs:
         self.size += getsize(c)/1024
示例#6
0
 def initialize(self):
     self.name = _('Calendario de Windows')
     self.description = _('Calendario de Windows')
     self.size = 0
     self.icals = glob.glob(join(self.user.folders['Local AppData'].path, 'Microsoft', 'Windows Calendar', 'Calendars','*.ics'))
     if not self.icals:
         raise Exception
     for cal in self.icals:
         self.size += getsize(cal)
示例#7
0
 def insertar_usuario(self, u):
     key = u.get_name() + " ("+ u.os +")"
     gtk.gdk.threads_enter()
     self.list_users.append([gtk.gdk.pixbuf_new_from_file_at_size(u.get_avatar(), 80 ,80), u.get_name(), u.os, u])
     if len(self.list_users) == 1:
         self.label2.set_markup('<b>'+str(len(self.list_users))+ '</b>' + ' ' + _("usuario encontrado"))
     elif len(self.list_users) > 1:
         self.label2.set_markup('<b>'+str(len(self.list_users))+ '</b>' + ' ' + _("usuarios encontrados"))
     gtk.gdk.threads_leave()
示例#8
0
 def initialize(self):
     """Inicializa los valores específicos de la aplicación.
     Este método debe ser apliado en las clases hijas
     """
     self.name = _("Lector de correo")
     self.size = 0
     self.mailconfigs = []
     self.mailboxes = []
     self.dest = folder(os.path.join(os.path.expanduser('~'),'.evolution','mail','local', _("Correo de ")+ self.name +'.sbd'))
     self.description = self.name +": %d"%len(self.mailconfigs)+ _("cuentas de correo")
示例#9
0
    def initialize(self):
        """Inicializa los parametros específicos de la aplicación"""

        self.name = self.option.get_name()
        self.size = self.option.get_size()
        self.files = self.option.count_files()
        self.copied = 0
        self.type = "data"
        self.destination = None
        self.path = self.option
        self.description = _("Carpeta") + " '%s': %d " % (self.name, self.files) + _("archivos")
    def initialize(self):
        """Inicializa los valores específicos de la aplicación."""
        self.name = _("Mozilla Thunderbird")
        self.mailboxes = []
        self.size = 0
        self.mailconfigs = self.get_configuration()
        self.description = self.name + ": %d " % len(self.mailconfigs) + _("cuentas de correo")
        for mb in self.mailboxes:
            self.size += mb.get_size()

        if not self.mailconfigs:
            raise Exception
示例#11
0
 def destroy(self, widget, data=None):
     """Finaliza la ejecución del asistente y limpiar los archivos temporales"""
     if self.working:
         self.abort = True
         self.pause = False
         return 0
     print _("Saliendo del asistente")
     iter = self.list_users.get_iter_root()
     model = self.users.get_model()
     while iter:
         print _("Eliminando archivos temporales...")
         model.get_value(iter, 3).clean()
         iter = self.list_users.iter_next(iter)
     gtk.main_quit()
示例#12
0
 def initialize(self):
     self.name = _('Fondo de escritorio')
     self.description = _('Imagen de fondo de escritorio')
     w = self.user.search_key("Control Panel\\Desktop")
     if 'WallPaper' in w.keys():
         self.image = self.user.check_path(w['WallPaper'])
     elif 'Wallpaper' in w.keys():
         self.image = self.user.check_path(w['Wallpaper'])
     else:
         raise Exception
     
     if not exists(self.image):
         #bug in Windows XP
         self.image = self.image.replace('/w','/W')
     self.size = getsize(self.image)/1024
示例#13
0
 def config_EVOLUTION_addressbook(self):
     """Convierte e integra los contactos en la libreta de direcciones
     de Evolution
     
     """
     vcard = os.path.join(self.dest.path, _("Contactos"))
     if not os.path.exists(vcard):
         vcard = commands.getoutput("rgrep -l VCARD %s" % self.dest.path.replace(' ', '\ '))
     if not vcard or not os.path.exists(vcard):
         return 0
     import bsddb
     adb=os.path.join(os.path.expanduser('~'),'.evolution','addressbook','local','system','addressbook.db')
     folder(os.path.dirname(adb))
     db = bsddb.hashopen(adb,'w')
     if not 'PAS-DB-VERSION\x00' in db.keys():
         db['PAS-DB-VERSION\x00'] = '0.2\x00'
     contacts = open(vcard, 'r')
     while 1:
         l = contacts.readline()
         if not l:
             break
         if l.find('BEGIN:VCARD') != -1:
             randomid = 'pas-id-' + str(random.random())[2:]
             db[randomid+'\x00'] = 'BEGIN:VCARD\r\nUID:' + randomid + '\r\n'
             while 1:
                 v = contacts.readline()
                 if v.find('END:VCARD') != -1:
                     db[randomid+'\x00'] += 'END:VCARD\x00'
                     break
                 else:
                     db[randomid+'\x00'] += v.replace('PERSONAL','HOME').replace('\n', '\r\n')
     db.sync()
     db.close()
     os.remove(vcard)
示例#14
0
 def initialize(self):
     """Inicializa los parametros específicos de la aplicación"""
     if not os.path.exists("/usr/bin/unoconv"):
         raise Exception
     self.name = _("Convertir archivos de ofimática")
     self.filelist = self.option.search_by_ext(self.option.document_files + self.option.presentation_files + self.option.spread_files)
     self.files = len(self.filelist)
     if not self.files:
         raise Exception
     self.size = self.get_total_size()
     self.copied = 0
     self.type = "data"
     self.destination = None
     self.timer = None
     self.path = self.option
     self.description = _("Conversión de") + " %d " % self.files + _("archivos ofimáticos")
示例#15
0
 def update_progress(self, value=0, delta=0):
     """Actualiza la barra de progreso asociada a la tarea en con un 
     valor concreto o con un incremento relativo. Sólo válido para 
     la interfaz gráfica de Amigu
     
     Argumentos de entrada:
     value -- nuevo valor de la barra de progreso (default 0)
     delta -- nuevo incremento de la barra de progreso (default 0)
     """
     try:
         gtk.gdk.threads_enter()
         if value and delta:
             try:
                 self.copied += value
                 status = _("Migrando...") + " (%d/%d)" % (self.copied, self.files)
                 self.model.set_value(self.iter, 3, status)
             except:
                 pass
         elif value:
             self.model.set_value(self.iter, 2, value)
         elif delta:
             self.model.set_value(self.iter, 2, delta + float(self.model.get_value(self.iter, 2)))
     except:
         pass
     finally:
         gtk.gdk.threads_leave()
示例#16
0
 def initialize(self):
     """Personaliza los parámetro de la aplicación"""
     if not self.option:
         raise Exception
     self.name = self.option
     self.description = _("Windows Live ID") +": " +self.name
     self.size = 1
 def import_mails(self):
     """Convierte los correos al formato Mailbox."""
     self.dest = folder(
         os.path.join(os.path.expanduser("~"), ".evolution", "mail", "local", _("Correo de ") + self.name + ".sbd")
     )
     for mb in self.mailboxes:
         mb.copy(self.dest, exclude=[".dat", ".msf"])
示例#18
0
    def dialogo_advertencia(self, mensaje = "", progreso=False):
        """Muestra mensajes de aviso"""
        # crear
        self.advertencia = gtk.Dialog(_("Aviso"), self.window, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
                     (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
        
        h1 = gtk.HBox(False, 10)

        # añadir
        self.advertencia.vbox.pack_start(h1, True, False, 10)
        if progreso:
            self.progreso2 = gtk.ProgressBar(None)
            self.progreso2.pulse()
            self.advertencia.vbox.pack_start(self.progreso2, True, False, 1)
            stock = gtk.STOCK_EXECUTE
            self.wait = True
            hilo2 = threading.Thread(target=self.pulse, args=())
            hilo2.start()
        else:
            stock = gtk.STOCK_DIALOG_WARNING
        logoad = gtk.Image()
        logoad.set_from_stock(stock, 6)
        iconad = self.advertencia.render_icon(stock, 1)
        self.advertencia.set_icon(iconad)
        mensaje = gtk.Label(mensaje)
        h1.pack_start(logoad, True, False, 10)
        h1.pack_start(mensaje, True, False, 10)
        self.advertencia.show_all()
        self.advertencia.set_default_response(gtk.RESPONSE_ACCEPT)
        r = self.advertencia.run()
        self.advertencia.destroy()
        self.advertencia = None
        self.wait = False
示例#19
0
    def initialize(self):
        """Inicializa los valores específicos de la aplicación."""
        self.size = 0
        self.mailconfigs = []
        self.mailboxes = []

        self.name = _("Outlook XP-2002-2003")
        pst = glob.glob(os.path.join(self.user.folders["Local AppData"].path, 'Microsoft','Outlook', '?utlook.pst'))
        if pst and os.path.exists(pst[0]):
            self.mailboxes.append(pst[0])
        self.mailconfigs = self.get_configuration()
        self.description = self.name +": %d "%len(self.mailconfigs)+ _("cuentas de correo")
        if not self.mailconfigs:
            raise Exception

        for mb in self.mailboxes:
            self.size = os.path.getsize(mb)/1024
示例#20
0
 def initialize(self):
     """Personaliza los parámetros de la aplicación"""
     self.option = self.user.get_GTALK_account()
     if not self.option:
         raise Exception
     self.name = self.option.endswith('gmail.com') and self.option or self.option + "@gmail.com"
     self.description = _("Google Talk") +": " +self.name
     self.size = 1
示例#21
0
    def initialize(self):
        """Inicializa los valores específicos de la aplicación."""
        self.size = 0
        self.mailconfigs = []
        self.mailboxes = []
        
        self.name = _("Outlook 2007")
        self.description = _("Datos y configuraciones de MS Office Outlook 2007")
        pst = os.path.join(self.user.folders["Local AppData"].path, 'Microsoft','Outlook', 'Outlook.pst')
        if os.path.exists(pst):
            self.mailboxes.append(pst)
        self.mailconfigs = self.get_configuration()
        if not self.mailconfigs:
            raise Exception

        for mb in self.mailboxes:
            self.size = os.path.getsize(mb)/1024
        self.description = self.name +": %d "%len(self.mailconfigs)+ _("cuentas de correo")
示例#22
0
 def initialize(self):
     self.name = _("eMule")
     self.description = _("Configuración de eMule")+"\n"+_("Seleccione también la opción Archivos")
     self.cfg_dir = self.get_configuration()
     self.inc_dir, self.tmp_dir = None, None
     if not self.cfg_dir:
         raise Exception
     self.size = self.cfg_dir.get_size()
     self.get_paths()
     if self.user.os.find('Vista') > 1:
         f = self.user.folders['Downloads'].path
     elif self.user.os.find('XP') > 1:
         f = self.user.get_personal_folder().path
     if self.inc_dir and not self.inc_dir.path.startswith(f):
         self.size += self.inc_dir.get_size()
         self.description = _("Configuración y archivos de eMule")
     if self.tmp_dir and not self.tmp_dir.path.startswith(f):
         self.size += self.tmp_dir.get_size()
         self.description = _("Configuración y archivos de eMule")
示例#23
0
 def get_tree_links(self):
     """Devuelve el arbol de marcadores/favoritos de la aplicación
     contenido en un objeto de tipo TreeStore
     
     """
     tree = TreeStore(str, str)
     folder = tree.append(None, [_("Marcadores de Opera"), None])
     #print "#########################################################"
     self.get_bookmarks(tree, folder, self.get_configuration())
     #print "#########################################################"
     return tree
示例#24
0
 def recorrer_tareas(self, iterator, model):
     tarea = model.get_value(iterator, 4)
     if tarea and model.get_value(iterator, 1):
         self.tasks.append([model.get_value(iterator, 3),gtk.STOCK_MEDIA_PAUSE,0,_("Esperando..."), -1, tarea])
         self.n_tasks += 1
     if model.iter_children(iterator):
         #caso recursivo
         hijas = model.iter_children(iterator)
         while hijas:
             self.recorrer_tareas(hijas, model)
             # siguiente elemento
             hijas = model.iter_next(hijas)
示例#25
0
 def generar_resumen(self, model):
     """Genera el resumen de las tareas pendiente"""
     self.n_tasks = 0
     self.tasks.clear()
     iter = model.get_iter_root()
     if iter:
         self.recorrer_tareas(iter, model)
     if self.n_tasks:
         self.apply_boton.set_sensitive(True)
     else:
         self.dialogo_advertencia(_("No se seleccionado ninguna opción de migración"))
         self.apply_boton.set_sensitive(False)
示例#26
0
 def config_EVOLUTION_calendar(self):
     """Convierte e integra el calendario en Evolution"""
     vcal = os.path.join(self.dest.path, _("Calendario"))
     if not os.path.exists(vcal):
         vcal = commands.getoutput("rgrep -l VEVENT %s" % self.dest.path.replace(' ', '\ '))
     if not vcal or not os.path.exists(vcal):
         return 0
     old = None
     dates = []
     evo_cal = os.path.join(os.path.expanduser('~'),'.evolution','calendar','local','system','calendar.ics')
     folder(os.path.dirname(evo_cal))
     if os.path.exists(evo_cal):
         old = backup(evo_cal)
         if old:
             new_cal = open(evo_cal, "w")
             old_cal = open(old, 'r')
             for l in old_cal.readlines():
                 if l.find('END:VCALENDAR') == -1:
                     new_cal.write(l)
                 if l.find('BEGIN:VEVENT') != -1:
                     dt, sum = None, None
                 elif l.find('END:VEVENT') != -1:
                     if dt and sum:
                         dates.append(dt+sum)
                 elif l.find('DTSTART') != -1:
                     dt = l.replace('DTSTART:', '')
                 elif l.find('SUMMARY') != -1:
                     sum = l.replace('SUMMARY:', '')
             old_cal.close()
     orig = open(vcal,"r")
     events = False
     if not old:
         new_cal = open(evo_cal, "w")
         new_cal.write('BEGIN:VCALENDAR\n')
         new_cal.write('CALSCALE:GREGORIAN\n')
         new_cal.write('VERSION:2.0\n')
     buffer = ''
     for l in orig.readlines():
         buffer += l
         if l.find('BEGIN:VEVENT') != -1:
             dt, sum = None, None
             buffer = l
         elif l.find('END:VEVENT') != -1:
             if dt and sum and not dt+sum in dates:
                 new_cal.write(buffer)
         elif l.find('DTSTART') != -1:
             dt = l.replace('DTSTART:', '')
         elif l.find('SUMMARY') != -1:
             sum = l.replace('SUMMARY:', '')
     new_cal.write('END:VCALENDAR\n')
     orig.close()
     os.remove(vcal)
示例#27
0
    def buscar(self, widget):
        """Muestra el cuadro diálogo para seleccionar la ubicación de destino de los archivos"""
        # crear
        dialog = gtk.FileChooserDialog(_("Destino"), None, gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK))
        dialog.set_default_response(gtk.RESPONSE_OK)
        dialog.set_current_folder(os.path.expanduser('~'))

        # run
        response = dialog.run()
        if response == gtk.RESPONSE_OK:
            self.entry.set_text(dialog.get_current_folder())
            self.actualizar_espacio(self.window, self.entry)
        dialog.destroy()
示例#28
0
    def get_tree_options(self, update=False):
        """Devuele el árbol de opciones generado para el usario seleccionado.
        El objeto devuelto es de tipo gtk.TreeStore.
        Este método debe ampliarse en las clases hijas.
        
        Argumentos de entrada:
        update -- indica si se debe actualizar el contenido del árbol (default False)
        
        """
        if self.tree_options:
            if update:
                self.tree_options.clear()
            else:
                return self.tree_options
        else:
            from gtk import TreeStore
            self.tree_options = TreeStore( str, 'gboolean', str, str, str)

        name_usr = self.tree_options.append(None, [self.get_name(), None, None, _('Usuario seleccionado'), None])

        # Files
        parent = self.tree_options.append(name_usr , [_("Archivos"), None, None, _('Migrar archivos'), None] )
        personal = self.tree_options.append( parent, [_("Carpeta Personal"), None, str(self.folders['Personal'].get_size()), _('Archivos personales: ')+ self.folders['Personal'].get_info(), 'documentos'] )
        return self.tree_options
示例#29
0
    def buscar_usuarios(self):
        """Busca usuarios de otros sistemas en el ordenador"""
        gtk.gdk.threads_enter()
        self.label2.set_markup('<b>'+_("Buscando usuarios de otros sistemas...")+ '</b>')
        gtk.gdk.threads_leave()
        self.pc = mipc()
        self.pc.check_all_partitions()
        self.usuarios = {}
        wusers = self.pc.get_win_users()
        xusers = self.pc.get_lnx_users()
        musers = self.pc.get_mac_users()
        gtk.gdk.threads_enter()
        self.list_users.clear()
        self.users.set_model(self.list_users)
        gtk.gdk.threads_leave()
        n = 1
        options = {}
        aviso = ""

        for u, s in wusers.iteritems():
            try:
                usuario = mswin.winuser(u, self.pc, s)
            except:
                aviso += _("No se pudo acceder a algunos de los usuarios de Windows.") + "\n"
                continue
            else:
                self.insertar_usuario(usuario)
        for u, s in xusers.iteritems():
            try:
                usuario = openos.freeuser(u, self.pc, s)
            except:
                aviso += _("No se pudo acceder a algunos de los usuarios de Unix/Linux.") + "\n"
                continue
            else:
                self.insertar_usuario(usuario)
        for u, s in musers.iteritems():
            try:
                usuario = macos.macuser(u, self.pc, s)
            except:
                aviso += _("No se pudo acceder a algunos de los usuarios de Mac OS.") + "\n"
                continue
            else:
                self.insertar_usuario(usuario)
        if len(self.list_users) == 0:
            gtk.gdk.threads_enter()
            self.label2.set_markup('<b>'+_("No se han encontrado ningún usuario que migrar")+ '</b>' + aviso)
            gtk.gdk.threads_leave()
        else:
            gtk.gdk.threads_enter()
            self.label2.set_markup(_("Resultado de la búsqueda")+ ": "+ self.label2.get_text() + aviso)
            gtk.gdk.threads_leave()
示例#30
0
 def do(self):
     """Realiza el proceso de importación"""
     self.option.errors = []
     inc = 0
     errors = 0
     if self.model:
         inc = 100.0/(self.files + 1)
     self.abort = False
     dest = folder(self.destination)
     self.destination = dest.create_subfolder(_("Convertidos"))
     for f in self.filelist:
         if self.abort:
             break
         s = None
         ext = splitext(f)[1]
         if ext in self.option.document_files:
             s = self.odf_converter(f, 'odt')
         elif ext in self.option.presentation_files:
             s = self.odf_converter(f, 'odp')
         elif ext in self.option.spread_files:
             s = self.odf_converter(f, 'ods')
         if not s:
             continue
         if s.wait() < 0:
             errors += 1
         else:
             errors -= 1
             self.update_progress(1, 1)
             self.update_progress(delta=inc)
         self.outpipe.close()
         self.timer.cancel()
         if errors >= 10:
             self.cancel()
             return 0
         elif errors < 0:
             errors = 0
     return 1