Author: pollux Date: 2007-01-13 21:37:23 +0000 (Sat, 13 Jan 2007) New Revision: 24420
Modified: xfburn/branches/libburn_trial/NEWS xfburn/branches/libburn_trial/xfburn/xfburn-burn-data-composition-dialog.c xfburn/branches/libburn_trial/xfburn/xfburn-data-composition.c xfburn/branches/libburn_trial/xfburn/xfburn-data-disc-usage.c Log: * Add support for burning a composition using libburn * Fix the content of the ISO generated from a composition Modified: xfburn/branches/libburn_trial/NEWS =================================================================== --- xfburn/branches/libburn_trial/NEWS 2007-01-13 21:37:19 UTC (rev 24419) +++ xfburn/branches/libburn_trial/NEWS 2007-01-13 21:37:23 UTC (rev 24420) @@ -9,7 +9,8 @@ - Fix icon size in filesystem browser - Add icons for actions based on icons from the Tango icontheme - Detect supported speeds -- Add support for writing ISO from a composition +- Add support for writing ISO from a composition using libburn +- Add support for burning a composition using libburn xfburn 0.2.0beta ================ Modified: xfburn/branches/libburn_trial/xfburn/xfburn-burn-data-composition-dialog.c =================================================================== --- xfburn/branches/libburn_trial/xfburn/xfburn-burn-data-composition-dialog.c 2007-01-13 21:37:19 UTC (rev 24419) +++ xfburn/branches/libburn_trial/xfburn/xfburn-burn-data-composition-dialog.c 2007-01-13 21:37:23 UTC (rev 24420) @@ -30,6 +30,7 @@ #include "xfburn-global.h" #include "xfburn-utils.h" #include "xfburn-settings.h" +#include "xfburn-stock.h" #include "xfburn-device-box.h" #include "xfburn-burn-data-composition-dialog.h" @@ -120,6 +121,7 @@ { XfburnBurnDataCompositionDialogPrivate *priv = XFBURN_BURN_DATA_COMPOSITION_DIALOG_GET_PRIVATE (obj); + GdkPixbuf *icon = NULL; GtkBox *box = GTK_BOX (GTK_DIALOG (obj)->vbox); GtkWidget *img; GtkWidget *frame; @@ -131,7 +133,9 @@ gtk_window_set_title (GTK_WINDOW (obj), _("Burn Composition")); gtk_window_set_destroy_with_parent (GTK_WINDOW (obj), TRUE); - gtk_window_set_icon_name (GTK_WINDOW (obj), GTK_STOCK_CDROM); + icon = gtk_widget_render_icon (GTK_WIDGET (obj), XFBURN_STOCK_BURN_CD, GTK_ICON_SIZE_DIALOG, NULL); + gtk_window_set_icon (GTK_WINDOW (obj), icon); + g_object_unref (icon); /* burning devices list */ priv->device_box = xfburn_device_box_new (TRUE, TRUE, TRUE); @@ -201,7 +205,7 @@ gtk_widget_show (button); gtk_dialog_add_action_widget (GTK_DIALOG (obj), button, GTK_RESPONSE_CANCEL); - button = xfce_create_mixed_button (GTK_STOCK_CDROM, _("_Burn Composition")); + button = xfce_create_mixed_button ("xfburn-burn-cd", _("_Burn Composition")); gtk_widget_show (button); gtk_dialog_add_action_widget (GTK_DIALOG (obj), button, GTK_RESPONSE_OK); GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); @@ -337,28 +341,173 @@ g_free (params); } +typedef struct { + GtkWidget *dialog_progress; + XfburnDevice *device; + struct burn_source *src; + gint speed; + XfburnWriteMode write_mode; + gboolean eject; + gboolean dummy; + gboolean burnfree; +} ThreadBurnCompositionParams; + static void +thread_burn_composition (ThreadBurnCompositionParams * params) +{ + GtkWidget *dialog_progress = params->dialog_progress; + + struct burn_disc *disc; + struct burn_session *session; + struct burn_track *track; + + struct burn_drive_info *drive_info = NULL; + struct burn_drive *drive; + + struct burn_write_opts * burn_options; + enum burn_disc_status disc_state; + struct burn_progress progress; + gboolean burning_has_started = FALSE; + gint ret; + + disc = burn_disc_create (); + session = burn_session_create (); + track = burn_track_create (); + + ret = burn_disc_add_session (disc, session, BURN_POS_END); + if (ret == 0) { + xfburn_progress_dialog_burning_failed (XFBURN_PROGRESS_DIALOG (dialog_progress), _("Unable to create disc object")); + goto end; + } + + if (burn_track_set_source (track, params->src) != BURN_SOURCE_OK) { + xfburn_progress_dialog_burning_failed (XFBURN_PROGRESS_DIALOG (dialog_progress), _("Cannot attach source object to track object")); + goto end; + } + + burn_session_add_track (session, track, BURN_POS_END); + + if (!xfburn_device_grab (params->device, &drive_info)) { + xfburn_progress_dialog_burning_failed (XFBURN_PROGRESS_DIALOG (dialog_progress), _("Unable to grab drive")); + + goto end; + } + + drive = drive_info->drive; + + while (burn_drive_get_status (drive, NULL) != BURN_DRIVE_IDLE) + usleep(100001); + + /* Evaluate drive and media */ + while ((disc_state = burn_disc_get_status(drive)) == BURN_DISC_UNREADY) + usleep(100001); + if (disc_state == BURN_DISC_APPENDABLE && params->write_mode != WRITE_MODE_TAO) { + xfburn_progress_dialog_burning_failed (XFBURN_PROGRESS_DIALOG (dialog_progress), _("Cannot append data to multisession disc in this write mode (use TAO instead)")); + goto cleanup; + } else if (disc_state != BURN_DISC_BLANK) { + if (disc_state == BURN_DISC_FULL) + xfburn_progress_dialog_burning_failed (XFBURN_PROGRESS_DIALOG (dialog_progress), _("Closed media with data detected. Need blank or appendable media")); + else if (disc_state == BURN_DISC_EMPTY) + xfburn_progress_dialog_burning_failed (XFBURN_PROGRESS_DIALOG (dialog_progress), _("No media detected in drive")); + else + xfburn_progress_dialog_burning_failed (XFBURN_PROGRESS_DIALOG (dialog_progress), _("Cannot recognize state of drive and media")); + goto cleanup; + } + + burn_options = burn_write_opts_new (drive); + burn_write_opts_set_perform_opc (burn_options, 0); + burn_write_opts_set_multi (burn_options, 0); + + switch (params->write_mode) { + case WRITE_MODE_TAO: + burn_write_opts_set_write_type (burn_options, BURN_WRITE_TAO, BURN_BLOCK_MODE1); + break; + case WRITE_MODE_SAO: + burn_write_opts_set_write_type (burn_options, BURN_WRITE_SAO, BURN_BLOCK_SAO); + break; + case WRITE_MODE_RAW16: + burn_write_opts_set_write_type (burn_options, BURN_WRITE_RAW, BURN_BLOCK_RAW16); + break; + case WRITE_MODE_RAW96P: + burn_write_opts_set_write_type (burn_options, BURN_WRITE_RAW, BURN_BLOCK_RAW96P); + break; + case WRITE_MODE_RAW96R: + burn_write_opts_set_write_type (burn_options, BURN_WRITE_RAW, BURN_BLOCK_RAW96R); + break; + default: + xfburn_progress_dialog_burning_failed (XFBURN_PROGRESS_DIALOG (dialog_progress), _("The write mode is not supported currently")); + goto cleanup; + } + + burn_write_opts_set_simulate(burn_options, params->dummy ? 1 : 0); + burn_structure_print_disc (disc); + DBG ("TODO set speed"); + burn_drive_set_speed (drive, 0, 0); + burn_write_opts_set_underrun_proof (burn_options, params->burnfree ? 1 : 0); + + burn_disc_write (burn_options, disc); + burn_write_opts_free (burn_options); + + xfburn_progress_dialog_set_status_with_text (XFBURN_PROGRESS_DIALOG (dialog_progress), XFBURN_PROGRESS_DIALOG_STATUS_RUNNING, _("Burning composition...")); + + while (burn_drive_get_status (drive, NULL) == BURN_DRIVE_SPAWNING) + usleep(1002); + while (burn_drive_get_status (drive, &progress) != BURN_DRIVE_IDLE) { + if (progress.sectors > 0 && progress.sector >= 0) { + gdouble percent = 1.0 + ((gdouble) progress.sector+1.0) / ((gdouble) progress.sectors) * 98.0; + + burning_has_started = TRUE; + xfburn_progress_dialog_set_progress_bar_fraction (XFBURN_PROGRESS_DIALOG (dialog_progress), percent / 100.0); + } else if (burning_has_started && progress.sectors == 0) { + xfburn_progress_dialog_set_status_with_text (XFBURN_PROGRESS_DIALOG (dialog_progress), XFBURN_PROGRESS_DIALOG_STATUS_RUNNING, _("Finalizing disc...")); + } + + usleep (500000); + } + + xfburn_progress_dialog_set_status_with_text (XFBURN_PROGRESS_DIALOG (dialog_progress), XFBURN_PROGRESS_DIALOG_STATUS_COMPLETED, _("Done")); + + cleanup: + burn_drive_release (drive, params->eject ? 1 : 0); + /* commented because it unleashes hell + DBG ("drive_info: %p", drive_info); + + burn_drive_info_free (drive_info); + */ + end: + burn_track_free (track); + burn_session_free (session); + burn_disc_free (disc); + + burn_source_free (params->src); + g_free (params); +} + +static void cb_dialog_response (XfburnBurnDataCompositionDialog * dialog, gint response_id, XfburnBurnDataCompositionDialogPrivate * priv) { if (response_id == GTK_RESPONSE_OK) { GtkWidget *dialog_progress; - ThreadWriteIsoParams *params; + struct burn_source * src = NULL; + + src = iso_source_new_ecma119 (priv->volume_set, 0, 2, ECMA119_JOLIET); + if (src == NULL) { + /* could not create source */ + xfce_err (_("Could not create ISO source structure")); + return; + } + + dialog_progress = xfburn_progress_dialog_new (GTK_WINDOW (dialog)); + gtk_window_set_transient_for (GTK_WINDOW (dialog_progress), gtk_window_get_transient_for (GTK_WINDOW (dialog))); + gtk_widget_hide (GTK_WIDGET (dialog)); + + gtk_widget_show (dialog_progress); + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->check_only_iso))) { + ThreadWriteIsoParams *params = NULL; + /* create a new iso */ - struct burn_source * src = iso_source_new_ecma119 (priv->volume_set, 0, 2, ECMA119_JOLIET); - if (src == NULL) { - /* could not create source */ - xfce_err (_("Could not create ISO source structure")); - return; - } - - dialog_progress = xfburn_progress_dialog_new (GTK_WINDOW (dialog)); - gtk_window_set_transient_for (GTK_WINDOW (dialog_progress), gtk_window_get_transient_for (GTK_WINDOW (dialog))); - gtk_widget_hide (GTK_WIDGET (dialog)); - - gtk_widget_show (dialog_progress); - params = g_new0 (ThreadWriteIsoParams, 1); params->dialog_progress = dialog_progress; params->src = src; @@ -366,40 +515,27 @@ g_thread_create ((GThreadFunc) thread_write_iso, params, FALSE, NULL); } else { - xfce_info ("Coming soon"); - /* - gchar *speed = NULL; - gchar *write_mode = NULL; + ThreadBurnCompositionParams *params = NULL; XfburnDevice *device; - + gint speed; + XfburnWriteMode write_mode; + device = xfburn_device_box_get_selected_device (XFBURN_DEVICE_BOX (priv->device_box)); speed = xfburn_device_box_get_speed (XFBURN_DEVICE_BOX (priv->device_box)); + write_mode = xfburn_device_box_get_mode (XFBURN_DEVICE_BOX (priv->device_box)); - write_mode = xfburn_write_mode_combo_box_get_cdrecord_param (XFBURN_WRITE_MODE_COMBO_BOX (priv->combo_mode)); - - command = g_strconcat ("sh -c \"mkisofs -gui -graft-points -joliet -full-iso9660-filenames -iso-level 2 -volid '", volid, - "' -path-list ", priv->file_list, " | cdrecord -v gracetime=2", " dev=", device->node_path, - " ", write_mode, " speed=", speed, - gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->check_eject)) ? " -eject" : "", - gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->check_dummy)) ? " -dummy" : "", - gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->check_burnfree)) ? " driveropts=burnfree" : "", - " - \"", NULL); - g_free (speed); - g_free (write_mode); - - dialog_progress = xfburn_burn_data_composition_progress_dialog_new (); + /* burn composition */ + params = g_new0 (ThreadBurnCompositionParams, 1); + params->dialog_progress = dialog_progress; + params->device = device; + params->src = src; + params->speed = speed; + params->write_mode = write_mode; + params->eject = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->check_eject)); + params->dummy = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->check_dummy)); + params->burnfree = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->check_burnfree)); + g_thread_create ((GThreadFunc) thread_burn_composition, params, FALSE, NULL); } - - gtk_window_set_transient_for (GTK_WINDOW (dialog_progress), gtk_window_get_transient_for (GTK_WINDOW (dialog))); - gtk_widget_hide (GTK_WIDGET (dialog)); - - g_object_set_data (G_OBJECT (dialog_progress), "command", command); - gtk_dialog_run (GTK_DIALOG (dialog_progress)); - - g_free (command); - g_free (volid); - */ - } } } Modified: xfburn/branches/libburn_trial/xfburn/xfburn-data-composition.c =================================================================== --- xfburn/branches/libburn_trial/xfburn/xfburn-data-composition.c 2007-01-13 21:37:19 UTC (rev 24419) +++ xfburn/branches/libburn_trial/xfburn/xfburn-data-composition.c 2007-01-13 21:37:23 UTC (rev 24420) @@ -1428,10 +1428,6 @@ static void fill_volume_with_composition (GtkTreeModel *model, struct iso_tree_node * parent, GtkTreeIter *iter) { - GtkTreeIter child; - if (!gtk_tree_model_iter_children (model, &child, iter)) - return; - do { DataCompositionEntryType type; gchar *name = NULL; @@ -1439,7 +1435,7 @@ struct iso_tree_node *node = NULL; - gtk_tree_model_get (model, &child, DATA_COMPOSITION_COLUMN_TYPE, &type, + gtk_tree_model_get (model, iter, DATA_COMPOSITION_COLUMN_TYPE, &type, DATA_COMPOSITION_COLUMN_CONTENT, &name, DATA_COMPOSITION_COLUMN_PATH, &src, -1); if (type == DATA_COMPOSITION_TYPE_DIRECTORY) { @@ -1451,9 +1447,13 @@ g_free (name); g_free (src); - if (type == DATA_COMPOSITION_TYPE_DIRECTORY && gtk_tree_model_iter_has_child (model, &child)) + if (type == DATA_COMPOSITION_TYPE_DIRECTORY && gtk_tree_model_iter_has_child (model, iter)) { + GtkTreeIter child; + + gtk_tree_model_iter_children (model, &child, iter); fill_volume_with_composition (model, node, &child); - } while (gtk_tree_model_iter_next (model, &child)); + } + } while (gtk_tree_model_iter_next (model, iter)); } static struct iso_volume * Modified: xfburn/branches/libburn_trial/xfburn/xfburn-data-disc-usage.c =================================================================== --- xfburn/branches/libburn_trial/xfburn/xfburn-data-disc-usage.c 2007-01-13 21:37:19 UTC (rev 24419) +++ xfburn/branches/libburn_trial/xfburn/xfburn-data-disc-usage.c 2007-01-13 21:37:23 UTC (rev 24420) @@ -29,6 +29,7 @@ #include "xfburn-global.h" #include "xfburn-settings.h" #include "xfburn-utils.h" +#include "xfburn-stock.h" /* prototypes */ static void xfburn_data_disc_usage_class_init (XfburnDataDiscUsageClass *); @@ -126,7 +127,7 @@ gtk_box_pack_start (GTK_BOX (disc_usage), disc_usage->combo, FALSE, FALSE, BORDER); gtk_widget_show (disc_usage->combo); - disc_usage->button = xfce_create_mixed_button ("xfburn-burn-cd", _("Burn composition")); + disc_usage->button = xfce_create_mixed_button (XFBURN_STOCK_BURN_CD, _("Burn composition")); gtk_box_pack_start (GTK_BOX (disc_usage), disc_usage->button, FALSE, FALSE, BORDER); gtk_widget_set_sensitive (disc_usage->button, FALSE); gtk_widget_show (disc_usage->button); _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits