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
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits