/* growisofs.c * Copyright (C) 2005 Sylvain Cresto * * This file is part of graveman! * * graveman! 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 2, or * (at your option) any later version. * * graveman! 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 program; see the file COPYING. If not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. * * URL: http://www.nongnu.org/graveman/ * */ #include "graveman.h" /* communication avec growisofs */ static gchar *get_title(gint Anbrgravure, gint Acurcd, gboolean Adosimul) { gchar *Ltxt = NULL; if (Anbrgravure==1) { if (!Adosimul) { Ltxt = g_strdup(_("Writing in progress...")); } else { Ltxt = g_strdup(_("AABB Simulated DVD writing in progress...")); } } else { if (!Adosimul) { Ltxt = g_strdup_printf(_("Writing DVD %d/%d in progress..."), Acurcd, Anbrgravure); } else { Ltxt = g_strdup_printf(_("Simulated DVD writing %d/%d in progress..."), Acurcd, Anbrgravure); } } return Ltxt; } /* callback appele lorsque cdrecord grave les pistes */ gboolean growisofs_grave_callback(GIOChannel *Astd, GIOCondition Acond, gpointer Adata) { GIOStatus Lstatus; GHashTable *Lhash = (GHashTable *)Adata; gchar *Lbuffer; Lstatus = g_io_channel_read_line(Astd, &Lbuffer, NULL, NULL, NULL); if (!Lbuffer) return FALSE; _DEB("===>%s", Lbuffer); g_free(Lbuffer); return TRUE; } /* copie d'une image iso */ gboolean burn_dvd(GHashTable *Ahash, GError **Aerror) { gchar **Lcmd; gchar *Lcommandline, *Lbufgrav, *Ltxt; gchar **Lrepertoire = (gchar **)g_hash_table_lookup(Ahash, "tmpdir"); gint *Lcont = (gint *) g_hash_table_lookup(Ahash, "cont"); gboolean *Labort = (gboolean *) g_hash_table_lookup(Ahash, "gabort"); GtkWindow *Lwindow = GTK_WINDOW(g_hash_table_lookup(Ahash, "window_burn")); gboolean Lsimul = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_hash_table_lookup(Ahash, "dvddatasimul"))); gint Lnbrgravure = gtk_spin_button_get_value(GTK_SPIN_BUTTON(g_hash_table_lookup(Ahash, "nbrdvddata"))); gint *Ldone = (gint *)g_hash_table_lookup(Ahash, "done"); /* fais */ gboolean *Loperationstatus = (gboolean *)g_hash_table_lookup(Ahash, "operationstatus"); gboolean Lwanteject = conf_get_boolean("eject"); gint *Lpid = (gint *) g_hash_table_lookup(Ahash, "pid"); GtkWidget *Lvitesse = g_hash_table_lookup(Ahash, "dstdvddataspeed"); GtkWidget *Lgraveur = g_hash_table_lookup(Ahash, "dstdvddatacombo"); GtkLabel *Ltitle = GTK_LABEL(g_hash_table_lookup(Ahash, "gravetitle")); gboolean Leject = FALSE; gboolean Ldosimul; gchar *Lbufvitesse; gchar *Loperation = g_hash_table_lookup(Ahash, "typeburn"); gint Lcurcd; gint Lnbrpass=1; gint g_out, g_err, Lnbrarg; guint Lcomevent, Lcomerrevent; GIOChannel *Lcom, *Lcomerr; gchar *Lisopara = NULL; gboolean Lstatus; GtkToggleButton *Lbtnnotfix = GTK_TOGGLE_BUTTON(g_hash_table_lookup(Ahash, "dvddatanotfix")); gboolean Lnotfix = Lbtnnotfix ? gtk_toggle_button_get_active(Lbtnnotfix) : FALSE; _DEB("DVD DATA\n"); _DEB("nbr gravure = [%d]\n", Lnbrgravure); Lbufvitesse = get_combo_value(Lvitesse); Lbufgrav = get_combo_value(Lgraveur); Lisopara = make_image_getextrapara(Ahash, "dvddata"); for (Lcurcd=1; Lcurcd<= Lnbrgravure; ((Lsimul && Lnbrpass>1) || (!Lsimul)) ? ( Lcurcd++, Lnbrpass=1 ) : ( Lnbrpass++ )) { Ldosimul = (Lsimul && Lnbrpass==1); /* faut il ejecter le DVD apres l'operation ? * oui si l'utilisateur a cocher la case "ejecter le cd" ou * si il faut realiser d'autre gravure sur d'autres DVD */ Leject = ((Lcurcd > 1 && (Lwanteject || Lcurcd0 && *Labort == FALSE) { gtk_main_iteration(); } exit_prog(*Lpid, Aerror, NULL); g_source_remove(Lcomerrevent); g_source_remove(Lcomevent); g_io_channel_shutdown(Lcomerr, FALSE, NULL); g_io_channel_unref(Lcomerr); g_io_channel_shutdown(Lcom, FALSE, NULL); g_io_channel_unref(Lcom); g_spawn_close_pid(*Lpid); *Lpid = 0; if (*Aerror) { Lstatus = FALSE; break; } if (*Loperationstatus == FALSE) { /* growisofs n'a pas reussi a grave le cd mais on n'a intercepte aucune erreur ! argh! * dans tous les cas ce n'est pas normal, on genere une erreur */ g_set_error(Aerror, GRAVEMAN_ERROR, _ERR_UNKNOWN_ERROR, _("Communication error with growisofs !")); Lstatus = FALSE; break; } if (Ldosimul) { /* fin de la simulation, tout s'est apparement bien passe * on demande confirmation avent de commencer la vrai gravure */ gint Lrep; GtkWidget *Lconfirm = gtk_message_dialog_new(Lwindow, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, _("Simulation successful. Do you want to write the DVD for real?")); Lrep = gtk_dialog_run(GTK_DIALOG(Lconfirm)); gtk_widget_destroy(Lconfirm); if (Lrep == GTK_RESPONSE_NO) { /* si c'est non alors on arrete */ *Labort = TRUE; Lstatus = TRUE; break; } } (*Ldone)++; } printf("fin !\n"); g_free(Lisopara); g_free(Lbufgrav); g_free(Lbufvitesse); return *Aerror ? FALSE : TRUE; } /* * vim:et:ts=8:sts=2:sw=2 */