74
61
static GtkDialogClass *parent_class = NULL;
76
static const gchar *mimes [] = { "application/x-cd-image",
79
"application/x-cdrdao-toc" };
82
brasero_image_option_dialog_set_track (BraseroImageOptionDialog *dialog,
83
BraseroImageFormat format,
87
BraseroImageOptionDialogPrivate *priv;
89
priv = BRASERO_IMAGE_OPTION_DIALOG_PRIVATE (dialog);
91
/* add a track every time to send a signal */
94
BraseroTrackType type = { 0, };
96
/* make sure something actually changed */
97
brasero_track_get_type (priv->track, &type);
100
uri = brasero_track_get_image_source (priv->track, TRUE);
102
uri = brasero_track_get_toc_source (priv->track, TRUE);
104
if (!toc && !image && !uri)
107
if((format == type.subtype.img_format)
108
&& uri && (image || toc)
109
&& !strcmp (uri, image?image:toc)) {
116
brasero_burn_session_clear_current_track (priv->session);
117
brasero_track_unref (priv->track);
120
/* set image type before adding so that signal has the right type */
121
priv->track = brasero_track_new (BRASERO_TRACK_TYPE_IMAGE);
122
brasero_track_set_image_source (priv->track,
126
brasero_burn_session_add_track (priv->session, priv->track);
130
brasero_image_option_dialog_image_info_cb (GObject *object,
136
BraseroImageOptionDialog *dialog = BRASERO_IMAGE_OPTION_DIALOG (object);
137
BraseroImageOptionDialogPrivate *priv;
139
priv = BRASERO_IMAGE_OPTION_DIALOG_PRIVATE (dialog);
142
brasero_image_option_dialog_set_track (dialog,
143
BRASERO_IMAGE_FORMAT_NONE,
149
if (!strcmp (g_file_info_get_content_type (info), "application/x-toc")
150
|| !strcmp (g_file_info_get_content_type (info), "application/x-cdrdao-toc")
151
|| !strcmp (g_file_info_get_content_type (info), "application/x-cue")) {
152
BraseroImageFormat format;
155
path = g_filename_from_uri (uri, NULL, NULL);
156
format = brasero_image_format_identify_cuesheet (path);
159
if (format != BRASERO_IMAGE_FORMAT_NONE)
160
brasero_image_option_dialog_set_track (dialog,
164
else if (g_str_has_suffix (path, ".toc"))
165
brasero_image_option_dialog_set_track (dialog,
166
BRASERO_IMAGE_FORMAT_CLONE,
170
brasero_image_option_dialog_set_track (dialog,
171
BRASERO_IMAGE_FORMAT_NONE,
175
else if (!strcmp (g_file_info_get_content_type (info), "application/octet-stream")) {
176
/* that could be an image, so here is the deal:
177
* if we can find the type through the extension, fine.
178
* if not default to CLONE */
179
if (g_str_has_suffix (uri, ".bin"))
180
brasero_image_option_dialog_set_track (dialog,
181
BRASERO_IMAGE_FORMAT_CDRDAO,
184
else if (g_str_has_suffix (uri, ".raw"))
185
brasero_image_option_dialog_set_track (dialog,
186
BRASERO_IMAGE_FORMAT_CLONE,
190
brasero_image_option_dialog_set_track (dialog,
191
BRASERO_IMAGE_FORMAT_BIN,
195
else if (!strcmp (g_file_info_get_content_type (info), "application/x-cd-image"))
196
brasero_image_option_dialog_set_track (dialog,
197
BRASERO_IMAGE_FORMAT_BIN,
201
brasero_image_option_dialog_set_track (dialog,
202
BRASERO_IMAGE_FORMAT_NONE,
208
brasero_image_option_dialog_get_format (BraseroImageOptionDialog *dialog,
211
BraseroImageOptionDialogPrivate *priv;
213
priv = BRASERO_IMAGE_OPTION_DIALOG_PRIVATE (dialog);
216
brasero_image_option_dialog_set_track (dialog,
217
BRASERO_IMAGE_FORMAT_NONE,
224
priv->io = brasero_io_get_default ();
226
if (!priv->info_type)
227
priv->info_type = brasero_io_register (G_OBJECT (dialog),
228
brasero_image_option_dialog_image_info_cb,
232
brasero_io_get_file_info (priv->io,
235
BRASERO_IO_INFO_MIME,
240
brasero_image_option_dialog_changed (BraseroImageOptionDialog *dialog)
243
BraseroImageFormat format;
244
BraseroImageOptionDialogPrivate *priv;
246
priv = BRASERO_IMAGE_OPTION_DIALOG_PRIVATE (dialog);
248
uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (priv->file));
249
brasero_image_type_chooser_get_format (BRASERO_IMAGE_TYPE_CHOOSER (priv->format), &format);
252
case BRASERO_IMAGE_FORMAT_NONE:
253
brasero_image_option_dialog_get_format (dialog, uri);
255
case BRASERO_IMAGE_FORMAT_BIN:
256
brasero_image_option_dialog_set_track (dialog,
261
case BRASERO_IMAGE_FORMAT_CUE:
262
brasero_image_option_dialog_set_track (dialog,
267
case BRASERO_IMAGE_FORMAT_CDRDAO:
268
brasero_image_option_dialog_set_track (dialog,
273
case BRASERO_IMAGE_FORMAT_CLONE:
274
brasero_image_option_dialog_set_track (dialog,
286
brasero_image_option_dialog_format_changed (BraseroImageTypeChooser *format,
287
BraseroImageOptionDialog *dialog)
289
brasero_image_option_dialog_changed (dialog);
293
brasero_image_option_dialog_file_changed (GtkFileChooser *chooser,
294
BraseroImageOptionDialog *dialog)
296
brasero_image_option_dialog_changed (dialog);
300
brasero_image_option_dialog_set_formats (BraseroImageOptionDialog *dialog)
302
BraseroImageOptionDialogPrivate *priv;
303
BraseroImageFormat formats;
304
BraseroImageFormat format;
305
BraseroTrackType output;
306
BraseroTrackType input;
307
BraseroMedium *medium;
310
priv = BRASERO_IMAGE_OPTION_DIALOG_PRIVATE (dialog);
315
/* get the available image types */
316
output.type = BRASERO_TRACK_TYPE_DISC;
317
drive = brasero_burn_session_get_burner (priv->session);
318
medium = brasero_drive_get_medium (drive);
319
output.subtype.media = brasero_medium_get_status (medium);
321
input.type = BRASERO_TRACK_TYPE_IMAGE;
322
formats = BRASERO_IMAGE_FORMAT_NONE;
323
format = BRASERO_IMAGE_FORMAT_CDRDAO;
325
for (; format != BRASERO_IMAGE_FORMAT_NONE; format >>= 1) {
326
BraseroBurnResult result;
328
input.subtype.img_format = format;
329
result = brasero_burn_caps_is_input_supported (priv->caps,
333
if (result == BRASERO_BURN_OK)
337
brasero_image_type_chooser_set_formats (BRASERO_IMAGE_TYPE_CHOOSER (priv->format),
342
64
brasero_image_option_dialog_set_image_uri (BraseroImageOptionDialog *dialog,
347
69
priv = BRASERO_IMAGE_OPTION_DIALOG_PRIVATE (dialog);
349
brasero_image_option_dialog_set_formats (dialog);
351
gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (priv->file), uri);
353
brasero_image_option_dialog_set_track (dialog,
354
BRASERO_IMAGE_FORMAT_NONE,
360
brasero_image_option_dialog_image_info_error (BraseroImageOptionDialog *dialog)
365
toplevel = gtk_widget_get_toplevel (GTK_WIDGET (dialog));
366
message = gtk_message_dialog_new (GTK_WINDOW (toplevel),
367
GTK_DIALOG_DESTROY_WITH_PARENT |
371
_("This image can't be burnt:"));
373
gtk_window_set_title (GTK_WINDOW (message), _("Invalid Image"));
375
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (message),
376
_("it doesn't appear to be a valid image or a valid cue file."));
378
gtk_dialog_run (GTK_DIALOG (message));
379
gtk_widget_destroy (message);
383
brasero_image_option_dialog_image_empty (BraseroImageOptionDialog *dialog)
388
toplevel = gtk_widget_get_toplevel (GTK_WIDGET (dialog));
389
message = gtk_message_dialog_new (GTK_WINDOW (toplevel),
390
GTK_DIALOG_DESTROY_WITH_PARENT |
394
_("There is no specified image:"));
396
gtk_window_set_title (GTK_WINDOW (message), _("No Image"));
398
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (message),
399
_("Please, choose an image and retry."));
401
gtk_dialog_run (GTK_DIALOG (message));
402
gtk_widget_destroy (message);
406
brasero_image_option_dialog_get_session (BraseroImageOptionDialog *dialog)
409
gchar *groups [] = { "brasero",
411
GtkRecentData recent_data = { NULL,
418
BraseroImageOptionDialogPrivate *priv;
419
BraseroTrackType type;
422
priv = BRASERO_IMAGE_OPTION_DIALOG_PRIVATE (dialog);
424
/* check that all could be set for the session */
425
image = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (priv->file));
427
brasero_image_option_dialog_image_empty (dialog);
432
brasero_track_get_type (priv->track, &type);
433
if (type.type == BRASERO_TRACK_TYPE_NONE
434
|| type.subtype.img_format == BRASERO_IMAGE_FORMAT_NONE) {
435
brasero_image_option_dialog_image_info_error (dialog);
439
/* Add it to recent file manager */
440
switch (type.subtype.img_format) {
441
case BRASERO_IMAGE_FORMAT_BIN:
442
recent_data.mime_type = (gchar *) mimes [0];
443
uri = brasero_track_get_image_source (priv->track, TRUE);
446
case BRASERO_IMAGE_FORMAT_CUE:
447
recent_data.mime_type = (gchar *) mimes [1];
448
uri = brasero_track_get_toc_source (priv->track, TRUE);
451
case BRASERO_IMAGE_FORMAT_CLONE:
452
recent_data.mime_type = (gchar *) mimes [2];
453
uri = brasero_track_get_toc_source (priv->track, TRUE);
456
case BRASERO_IMAGE_FORMAT_CDRDAO:
457
recent_data.mime_type = (gchar *) mimes [3];
458
uri = brasero_track_get_toc_source (priv->track, TRUE);
466
GtkRecentManager *recent;
468
recent = gtk_recent_manager_get_default ();
469
gtk_recent_manager_add_full (recent,
475
g_object_ref (priv->session);
476
return priv->session;
480
brasero_image_option_dialog_valid_media_cb (BraseroDestSelection *selection,
482
BraseroImageOptionDialog *self)
484
BraseroImageOptionDialogPrivate *priv;
486
priv = BRASERO_IMAGE_OPTION_DIALOG_PRIVATE (self);
488
brasero_image_option_dialog_set_formats (self);
489
gtk_widget_set_sensitive (priv->button, valid);
493
brasero_image_option_dialog_file_chooser_destroy (GtkWidget *file,
494
BraseroImageOptionDialog *self)
496
BraseroImageOptionDialogPrivate *priv;
500
priv = BRASERO_IMAGE_OPTION_DIALOG_PRIVATE (self);
502
uri = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (priv->file));
504
client = gconf_client_get_default ();
505
gconf_client_set_string (client, BRASERO_KEY_ISO_DIRECTORY, uri, NULL);
506
g_object_unref (client);
71
brasero_src_image_set_uri (BRASERO_SRC_IMAGE (priv->file), uri);
512
75
brasero_image_option_dialog_init (BraseroImageOptionDialog *obj)
519
GtkWidget *box, *box1;
520
GtkFileFilter *filter;
78
BraseroBurnSession *session;
521
79
BraseroImageOptionDialogPrivate *priv;
523
81
priv = BRASERO_IMAGE_OPTION_DIALOG_PRIVATE (obj);
525
gtk_dialog_set_has_separator (GTK_DIALOG (obj), FALSE);
527
button = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
528
gtk_widget_show (button);
529
gtk_dialog_add_action_widget (GTK_DIALOG (obj),
531
GTK_RESPONSE_CANCEL);
533
priv->button = brasero_utils_make_button (_("_Burn"),
535
"media-optical-burn",
536
GTK_ICON_SIZE_BUTTON);
537
gtk_widget_show (priv->button);
538
gtk_dialog_add_action_widget (GTK_DIALOG (obj),
542
priv->caps = brasero_burn_caps_get_default ();
544
priv->session = brasero_burn_session_new ();
545
brasero_burn_session_add_flag (priv->session,
546
BRASERO_BURN_FLAG_EJECT|
547
BRASERO_BURN_FLAG_NOGRACE|
548
BRASERO_BURN_FLAG_BURNPROOF|
549
BRASERO_BURN_FLAG_CHECK_SIZE|
550
BRASERO_BURN_FLAG_DONT_CLEAN_OUTPUT|
551
BRASERO_BURN_FLAG_FAST_BLANK);
554
priv->selection = brasero_dest_selection_new (priv->session);
555
g_signal_connect (priv->selection,
557
G_CALLBACK (brasero_image_option_dialog_valid_media_cb),
560
options = brasero_utils_pack_properties (_("<b>Select a disc to write to</b>"),
564
gtk_widget_show (options);
565
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (obj)->vbox),
571
brasero_drive_selection_set_type_shown (BRASERO_DRIVE_SELECTION (priv->selection),
572
BRASERO_MEDIA_TYPE_WRITABLE);
83
brasero_burn_options_set_type_shown (BRASERO_BURN_OPTIONS (obj),
84
BRASERO_MEDIA_TYPE_WRITABLE);
574
86
/* Image properties */
575
box1 = gtk_table_new (2, 2, FALSE);
576
gtk_table_set_col_spacings (GTK_TABLE (box1), 6);
577
gtk_widget_show (box1);
579
label = gtk_label_new (_("Path:"));
580
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
581
gtk_table_attach (GTK_TABLE (box1),
592
priv->file = gtk_file_chooser_button_new (_("Open an image"), GTK_FILE_CHOOSER_ACTION_OPEN);
593
gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (priv->file), FALSE);
595
client = gconf_client_get_default ();
596
uri = gconf_client_get_string (client, BRASERO_KEY_ISO_DIRECTORY, NULL);
597
g_object_unref (client);
599
if (!gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (priv->file), uri))
600
gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (priv->file), g_get_home_dir ());
605
gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (priv->file), g_get_home_dir ());
607
g_signal_connect (priv->file,
609
G_CALLBACK (brasero_image_option_dialog_file_chooser_destroy),
612
filter = gtk_file_filter_new ();
613
gtk_file_filter_set_name (filter, _("All files"));
614
gtk_file_filter_add_pattern (filter, "*");
615
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (priv->file), filter);
617
filter = gtk_file_filter_new ();
618
gtk_file_filter_set_name (filter, _("Image files only"));
619
gtk_file_filter_add_mime_type (filter, mimes [0]);
620
gtk_file_filter_add_mime_type (filter, mimes [1]);
621
gtk_file_filter_add_mime_type (filter, mimes [2]);
622
gtk_file_filter_add_mime_type (filter, mimes [3]);
623
gtk_file_filter_add_mime_type (filter, "image/*");
624
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (priv->file), filter);
625
gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (priv->file), filter);
627
gtk_table_attach (GTK_TABLE (box1),
637
g_signal_connect (priv->file,
639
G_CALLBACK (brasero_image_option_dialog_file_changed),
642
label = gtk_label_new (_("Image type:"));
643
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
644
gtk_widget_show (label);
645
gtk_table_attach (GTK_TABLE (box1),
656
priv->format = brasero_image_type_chooser_new ();
657
gtk_table_attach (GTK_TABLE (box1),
667
g_signal_connect (priv->format,
669
G_CALLBACK (brasero_image_option_dialog_format_changed),
672
box = brasero_utils_pack_properties (_("<b>Image</b>"),
676
gtk_box_pack_end (GTK_BOX (GTK_DIALOG (obj)->vbox),
682
gtk_widget_show_all (box);
683
brasero_image_option_dialog_set_formats (obj);
87
session = brasero_burn_options_get_session (BRASERO_BURN_OPTIONS (obj));
88
priv->file = brasero_src_image_new (session);
89
g_object_unref (session);
91
gtk_widget_show (priv->file);
94
string = g_strdup_printf ("<b>%s</b>", _("Select an image to write"));
95
brasero_burn_options_add_source (BRASERO_BURN_OPTIONS (obj),
687
103
brasero_image_option_dialog_finalize (GObject *object)
689
BraseroImageOptionDialogPrivate *priv;
691
priv = BRASERO_IMAGE_OPTION_DIALOG_PRIVATE (object);
694
brasero_io_cancel_by_base (priv->io, priv->info_type);
696
g_free (priv->info_type);
697
priv->info_type = NULL;
699
g_object_unref (priv->io);
704
brasero_track_unref (priv->track);
709
g_object_unref (priv->session);
710
priv->session = NULL;
714
g_object_unref (priv->caps);
718
105
G_OBJECT_CLASS (parent_class)->finalize (object);