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

Reply via email to