24 |
|
|
25 |
#include "graveman.h" |
#include "graveman.h" |
26 |
|
|
27 |
|
#define GROWISOFS_CURRENT_WRITE_SPEED "\"Current Write Speed\" is " |
28 |
|
#define GROWISOFS_DONE " done, estimate finish" |
29 |
|
#define GROWISOFS_FLUSHING_CACHE ": flushing cache" |
30 |
|
#define GROWISOFS_WRITING_LEADOUT ": writing lead-out" |
31 |
|
#define GROWISOFS_FAILED ":-( write failed:" |
32 |
|
#define GROWISOFS_USING "Using " |
33 |
|
|
34 |
/* communication avec growisofs */ |
/* communication avec growisofs */ |
35 |
static gchar *get_title(gint Anbrgravure, gint Acurcd, gboolean Adosimul) |
|
36 |
|
/* mise a jour du titre depuis le template prepare avec prepare_title */ |
37 |
|
void set_title(GHashTable *Ahash, gchar *Avitesse) { |
38 |
|
GtkLabel *Llabel = g_hash_table_lookup(Ahash, "gravetitle"); |
39 |
|
gchar *Ltitleshow = g_strdup_printf(_("Writing DVD in progress at %sx..."), Avitesse); |
40 |
|
|
41 |
|
gtk_label_set_text(Llabel, Ltitleshow); |
42 |
|
g_free(Ltitleshow); |
43 |
|
} |
44 |
|
|
45 |
|
gchar *get_title_preparing(gint Anbrgravure, gint Acurcd, gboolean Adosimul) |
46 |
{ |
{ |
|
gchar *Ltxt = NULL; |
|
47 |
if (Anbrgravure==1) { |
if (Anbrgravure==1) { |
48 |
if (!Adosimul) { |
if (!Adosimul) { |
49 |
Ltxt = g_strdup(_("Writing in progress...")); |
return g_strdup(_("DVD writing will start...")); |
50 |
} else { |
} else { |
51 |
Ltxt = g_strdup(_("AABB Simulated DVD writing in progress...")); |
return g_strdup(_("Simulated DVD writing will start...")); |
52 |
} |
} |
53 |
} else { |
} else { |
54 |
if (!Adosimul) { |
if (!Adosimul) { |
55 |
Ltxt = g_strdup_printf(_("Writing DVD %d/%d in progress..."), Acurcd, Anbrgravure); |
return g_strdup_printf(_("DVD writing %d/%d will start..."), Acurcd, Anbrgravure); |
56 |
} else { |
} else { |
57 |
Ltxt = g_strdup_printf(_("Simulated DVD writing %d/%d in progress..."), Acurcd, Anbrgravure); |
return g_strdup_printf(_("Simulated DVD writing %d/%d will start..."), Acurcd, Anbrgravure); |
58 |
} |
} |
59 |
} |
} |
|
|
|
|
return Ltxt; |
|
60 |
} |
} |
61 |
|
|
62 |
/* callback appele lorsque cdrecord grave les pistes */ |
/* callback appele lorsque cdrecord grave les pistes */ |
65 |
GIOStatus Lstatus; |
GIOStatus Lstatus; |
66 |
GHashTable *Lhash = (GHashTable *)Adata; |
GHashTable *Lhash = (GHashTable *)Adata; |
67 |
gchar *Lbuffer; |
gchar *Lbuffer; |
68 |
|
gchar *s, *t; |
69 |
|
GtkProgressBar *Lprogressbar = GTK_PROGRESS_BAR(g_hash_table_lookup(Lhash, "pb_total")); |
70 |
|
GtkProgressBar *Lprogressbar2 = GTK_PROGRESS_BAR(g_hash_table_lookup(Lhash, "pb_step")); |
71 |
|
GtkLabel *Ltitle = GTK_LABEL(g_hash_table_lookup(Lhash, "gravetitle")); |
72 |
|
GError **Lerreur = (GError **) g_hash_table_lookup(Lhash, "gerror"); /* pointeur erreur */ |
73 |
|
gdouble Lpct, Ltava; |
74 |
|
gchar Lsbuf[100], Lsbuf2[100]; |
75 |
|
gint *Lcont = (gint *) g_hash_table_lookup(Lhash, "cont"); /* on traite encore des donnees ? */ |
76 |
|
gint *Ltodo = (gint *) g_hash_table_lookup(Lhash, "todo"); /* nombre de piste a traiter */ |
77 |
|
gint *Ldone = (gint *) g_hash_table_lookup(Lhash, "done"); /* nombre de piste deja traite */ |
78 |
|
|
79 |
|
if (Acond == G_IO_HUP || Acond == G_IO_ERR) { |
80 |
|
*Lcont = 0; |
81 |
|
return FALSE; |
82 |
|
} |
83 |
|
|
84 |
Lstatus = g_io_channel_read_line(Astd, &Lbuffer, NULL, NULL, NULL); |
Lstatus = g_io_channel_read_line(Astd, &Lbuffer, NULL, NULL, NULL); |
85 |
if (!Lbuffer) return FALSE; |
if (!Lbuffer) return FALSE; |
86 |
|
|
87 |
_DEB("===>%s", Lbuffer); |
_DEB("===>%s", Lbuffer); |
88 |
|
|
89 |
|
|
90 |
|
if ((s=strstr(Lbuffer, GROWISOFS_CURRENT_WRITE_SPEED))) { |
91 |
|
/* mise a jour du titre lorsque l'on recois la vitesse */ |
92 |
|
s+=strlen(GROWISOFS_CURRENT_WRITE_SPEED); |
93 |
|
if ((t = strchr(s, 'x'))) { |
94 |
|
*t = 0; |
95 |
|
set_title(Lhash, s); |
96 |
|
} |
97 |
|
} else if (!strncmp(Lbuffer, GROWISOFS_USING, strlen(GROWISOFS_USING))) { |
98 |
|
/* rien pour le moment */ |
99 |
|
} else if (strstr(Lbuffer, GROWISOFS_DONE)) { |
100 |
|
/* gravure en cours ... */ |
101 |
|
if ((t=strchr(Lbuffer, '%'))) { |
102 |
|
s=ltrim(Lbuffer); |
103 |
|
|
104 |
|
/* avancement tache */ |
105 |
|
Lpct = 0.01 * atof(s); |
106 |
|
*t=0; |
107 |
|
|
108 |
|
gtk_progress_bar_set_fraction(Lprogressbar2, Lpct); |
109 |
|
g_snprintf(Lsbuf, sizeof(Lsbuf)-1, "%s%%", s); |
110 |
|
gtk_progress_bar_set_text(Lprogressbar2, Lsbuf); |
111 |
|
/* avancement total */ |
112 |
|
Ltava = (1.0 / (*Ltodo)) * ((*Ldone)-1+Lpct); |
113 |
|
gtk_progress_bar_set_fraction(Lprogressbar, Ltava); |
114 |
|
g_snprintf(Lsbuf2, sizeof(Lsbuf2)-1, "%.0f%%", Ltava*100); |
115 |
|
gtk_progress_bar_set_text(Lprogressbar, Lsbuf2); |
116 |
|
} |
117 |
|
} else if (strstr(Lbuffer, GROWISOFS_FLUSHING_CACHE)) { |
118 |
|
gtk_label_set_text(Ltitle, _("Flushing cache...")); |
119 |
|
gtk_progress_bar_set_fraction(Lprogressbar2, 1); |
120 |
|
gtk_progress_bar_set_text(Lprogressbar2, _("100%")); |
121 |
|
Ltava = (1.0 / (*Ltodo)) * ((*Ldone)); |
122 |
|
gtk_progress_bar_set_fraction(Lprogressbar, Ltava); |
123 |
|
g_snprintf(Lsbuf2, sizeof(Lsbuf2)-1, "%.0f%%", Ltava*100); |
124 |
|
gtk_progress_bar_set_text(Lprogressbar, Lsbuf2); |
125 |
|
} else if (strstr(Lbuffer, GROWISOFS_WRITING_LEADOUT)) { |
126 |
|
gboolean *Loperationstatus = (gboolean *)g_hash_table_lookup(Lhash, "operationstatus"); |
127 |
|
gtk_label_set_text(Ltitle, _("Writing lead-out...")); |
128 |
|
*Loperationstatus = TRUE; |
129 |
|
} else if ((s=strstr(Lbuffer, GROWISOFS_FAILED))) { |
130 |
|
gtk_label_set_text(Ltitle, _("Operation failed !")); |
131 |
|
s+=strlen(GROWISOFS_FAILED); |
132 |
|
g_set_error(Lerreur, GRAVEMAN_ERROR, _ERR_GROWISOFS, s ? s : _("Operation failed !")); |
133 |
|
return FALSE; |
134 |
|
} |
135 |
|
|
136 |
g_free(Lbuffer); |
g_free(Lbuffer); |
137 |
|
|
138 |
return TRUE; |
return TRUE; |
178 |
Lbufgrav = get_combo_value(Lgraveur); |
Lbufgrav = get_combo_value(Lgraveur); |
179 |
Lisopara = make_image_getextrapara(Ahash, "dvddata"); |
Lisopara = make_image_getextrapara(Ahash, "dvddata"); |
180 |
|
|
|
|
|
181 |
for (Lcurcd=1; Lcurcd<= Lnbrgravure; |
for (Lcurcd=1; Lcurcd<= Lnbrgravure; |
182 |
((Lsimul && Lnbrpass>1) || (!Lsimul)) ? ( Lcurcd++, Lnbrpass=1 ) : ( Lnbrpass++ )) { |
((Lsimul && Lnbrpass>1) || (!Lsimul)) ? ( Lcurcd++, Lnbrpass=1 ) : ( Lnbrpass++ )) { |
183 |
|
|
184 |
Ldosimul = (Lsimul && Lnbrpass==1); |
Ldosimul = (Lsimul && Lnbrpass==1); |
185 |
|
if (Lcurcd > 1 && !Ldosimul) { |
186 |
|
/* copie sur un nouveau dvd, on demande a l'utilisateur d'inserer le |
187 |
|
* nouveau dvdvierge */ |
188 |
|
gint Lrep; |
189 |
|
GtkWidget *Lconfirm = gtk_message_dialog_new(Lwindow, |
190 |
|
GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, |
191 |
|
GTK_BUTTONS_YES_NO, |
192 |
|
_("Now you should insert next DVD-RW/DVD+RW, do you want to continue operation ?")); |
193 |
|
Lrep = gtk_dialog_run(GTK_DIALOG(Lconfirm)); |
194 |
|
gtk_widget_destroy(Lconfirm); |
195 |
|
if (Lrep == GTK_RESPONSE_NO) { |
196 |
|
/* si c'est non alors on arrete */ |
197 |
|
*Labort = TRUE; |
198 |
|
Lstatus = TRUE; |
199 |
|
break; |
200 |
|
} |
201 |
|
|
202 |
|
} |
203 |
|
|
204 |
|
|
205 |
|
|
206 |
/* faut il ejecter le DVD apres l'operation ? |
/* faut il ejecter le DVD apres l'operation ? |
207 |
* oui si l'utilisateur a cocher la case "ejecter le cd" ou |
* oui si l'utilisateur a cocher la case "ejecter le cd" ou |
208 |
* si il faut realiser d'autre gravure sur d'autres DVD */ |
* si il faut realiser d'autre gravure sur d'autres DVD */ |
211 |
*Loperationstatus = FALSE; |
*Loperationstatus = FALSE; |
212 |
|
|
213 |
_DEB("gravure du cd [%d]", Lcurcd); |
_DEB("gravure du cd [%d]", Lcurcd); |
214 |
Ltxt = get_title(Lnbrgravure, Lcurcd, Ldosimul); |
|
215 |
|
Ltxt = get_title_preparing(Lnbrgravure, Lcurcd, Ldosimul); |
216 |
gtk_label_set_text(Ltitle, Ltxt); |
gtk_label_set_text(Ltitle, Ltxt); |
217 |
g_free(Ltxt); |
g_free(Ltxt); |
218 |
|
|
219 |
Lcommandline = g_strdup_printf("%s %s %s %s %s%s -use-the-force-luke=tty%s %s -f %s/", |
Lcommandline = g_strdup_printf("%s %s %s %s %s%s %s -gui -use-the-force-luke=tty%s %s -f %s/", |
220 |
conf_get_string("growisofs"), |
conf_get_string("growisofs"), |
221 |
Lnotfix ? "" : "-dvd-compat", |
Lnotfix ? "" : "-dvd-compat", |
222 |
Loperation, Lbufgrav, |
Loperation, Lbufgrav, |
223 |
*Lbufvitesse != '0' ? "speed=" : "", *Lbufvitesse != '0' ? Lbufvitesse : "", |
*Lbufvitesse != '0' ? "-speed=" : "", *Lbufvitesse != '0' ? Lbufvitesse : "", |
224 |
|
conf_get_boolean("overburn") ? "-overburn" : "", |
225 |
Ldosimul ? ",dummy" : "", /* simulation ? */ |
Ldosimul ? ",dummy" : "", /* simulation ? */ |
226 |
Lisopara, /* parametres supplementaires tel que le nom de volume du cd */ |
Lisopara, /* parametres supplementaires tel que le nom de volume du cd */ |
227 |
*Lrepertoire |
*Lrepertoire |
249 |
|
|
250 |
Lcom = g_io_channel_unix_new( g_out ); |
Lcom = g_io_channel_unix_new( g_out ); |
251 |
g_io_channel_set_encoding (Lcom, NULL, NULL); |
g_io_channel_set_encoding (Lcom, NULL, NULL); |
|
g_io_channel_set_buffered(Lcom, FALSE); |
|
252 |
g_io_channel_set_flags( Lcom, G_IO_FLAG_NONBLOCK, NULL ); |
g_io_channel_set_flags( Lcom, G_IO_FLAG_NONBLOCK, NULL ); |
253 |
Lcomevent = g_io_add_watch (Lcom, (G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_PRI), |
Lcomevent = g_io_add_watch (Lcom, (G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_PRI), |
254 |
growisofs_grave_callback, Ahash); |
growisofs_grave_callback, Ahash); |
255 |
|
|
256 |
Lcomerr = g_io_channel_unix_new( g_err ); |
Lcomerr = g_io_channel_unix_new( g_err ); |
257 |
g_io_channel_set_encoding (Lcomerr, NULL, NULL); |
g_io_channel_set_encoding (Lcomerr, NULL, NULL); |
|
g_io_channel_set_buffered(Lcomerr, FALSE); |
|
258 |
g_io_channel_set_flags( Lcomerr, G_IO_FLAG_NONBLOCK, NULL ); |
g_io_channel_set_flags( Lcomerr, G_IO_FLAG_NONBLOCK, NULL ); |
259 |
Lcomerrevent = g_io_add_watch (Lcomerr, (G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_PRI), |
Lcomerrevent = g_io_add_watch (Lcomerr, (G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_PRI), |
260 |
growisofs_grave_callback, Ahash); |
growisofs_grave_callback, Ahash); |
273 |
g_io_channel_unref(Lcom); |
g_io_channel_unref(Lcom); |
274 |
g_spawn_close_pid(*Lpid); |
g_spawn_close_pid(*Lpid); |
275 |
*Lpid = 0; |
*Lpid = 0; |
276 |
|
|
277 |
if (*Aerror) { |
if (*Aerror) { |
278 |
Lstatus = FALSE; |
Lstatus = FALSE; |
279 |
break; |
break; |