[Goodies-commits] r4852 - xfburn/trunk/xfburn

David Mohr squisher at xfce.org
Wed May 28 15:09:00 CEST 2008


Author: squisher
Date: 2008-05-28 13:09:00 +0000 (Wed, 28 May 2008)
New Revision: 4852

Modified:
   xfburn/trunk/xfburn/xfburn-blank-dialog.c
Log:
Adding format & deformat options to the blanking dialog

Modified: xfburn/trunk/xfburn/xfburn-blank-dialog.c
===================================================================
--- xfburn/trunk/xfburn/xfburn-blank-dialog.c	2008-05-28 03:19:37 UTC (rev 4851)
+++ xfburn/trunk/xfburn/xfburn-blank-dialog.c	2008-05-28 13:09:00 UTC (rev 4852)
@@ -43,19 +43,42 @@
   GtkWidget *check_eject;
 } XfburnBlankDialogPrivate;
 
-enum XfburnBlankModes {
-  XFBURN_BLANK_FAST,      /* erase w/ fast flag */
-  XFBURN_BLANK_COMPLETE,  /* erase, no flag */
-  XFBURN_FORMAT_FAST,
-  XFBURN_FORMAT_COMPLETE,
-  XFBURN_DEFORMAT_FAST,
-  XFBURN_DEFORMAT_COMPLETE,
-};
+typedef enum {
+  XFBURN_BLANK_FAST,        /* erase w/ fast flag */
+  XFBURN_BLANK_COMPLETE,    /* erase, no flag */
+  XFBURN_FORMAT_FAST,       /* DVD+RW sequential (0x13) to overwritable (0x14), zero size */
+  XFBURN_FORMAT_COMPLETE,   /* DVD+RW sequential (0x13) to overwritable (0x14), 128MB, flag=1*/
+  XFBURN_DEFORMAT_FAST,     /* same as fast blank */
+  XFBURN_DEFORMAT_COMPLETE, /* same as complete blank */
+  XFBURN_BLANK_MODE_LAST,
+} XfburnBlankMode;
 
+static char * blank_mode_names[] = 
+  { "Blank Fast",
+    "Blank Complete (slow)",
+    "Format Fast",
+    "Format Complete",
+    "Deformat Fast",
+    "Deformat Complete",
+  };
 
+#define XFBURN_FORMAT_COMPLETE_SIZE 128*1024*1024
+
+typedef struct {
+  GtkWidget *dialog_progress;
+  XfburnDevice *device;
+  XfburnBlankMode blank_mode;
+  gboolean eject;
+} ThreadBlankParams;
+
+/* internal prototypes */
+
 static void xfburn_blank_dialog_class_init (XfburnBlankDialogClass * klass);
 static void xfburn_blank_dialog_init (XfburnBlankDialog * sp);
 
+static gboolean is_valid_blank_mode (XfburnDevice *device, XfburnBlankMode mode);
+//static GList * get_valid_blank_modes (XfburnDevice *device);
+static void thread_blank (ThreadBlankParams * params);
 static void xfburn_blank_dialog_response_cb (XfburnBlankDialog * dialog, gint response_id, gpointer user_data);
 
 static XfceTitledDialogClass *parent_class = NULL;
@@ -103,6 +126,8 @@
   GtkWidget *frame;
   GtkWidget *vbox;
   GtkWidget *button;
+
+  XfburnBlankMode mode = XFBURN_BLANK_FAST;
   
   gtk_window_set_title (GTK_WINDOW (obj), _("Blank CD-RW"));
   gtk_window_set_destroy_with_parent (GTK_WINDOW (obj), TRUE);
@@ -119,14 +144,17 @@
   gtk_widget_show (frame);
   gtk_box_pack_start (box, frame, FALSE, FALSE, BORDER);
 
-  /* blank type */
+  /* blank mode */
   priv->combo_type = gtk_combo_box_new_text ();
-  gtk_combo_box_append_text (GTK_COMBO_BOX (priv->combo_type), _("Fast"));
-  gtk_combo_box_append_text (GTK_COMBO_BOX (priv->combo_type), _("Complete"));
+  while (mode < XFBURN_BLANK_MODE_LAST) {
+    if (is_valid_blank_mode (NULL, mode)) 
+      gtk_combo_box_append_text (GTK_COMBO_BOX (priv->combo_type), _(blank_mode_names[mode]));
+    mode++;
+  }
   gtk_combo_box_set_active (GTK_COMBO_BOX (priv->combo_type), 0);
   gtk_widget_show (priv->combo_type);
 
-  frame = xfce_create_framebox_with_content (_("Blank type"), priv->combo_type);
+  frame = xfce_create_framebox_with_content (_("Blank mode"), priv->combo_type);
   gtk_widget_show (frame);
   gtk_box_pack_start (box, frame, FALSE, FALSE, BORDER);
 
@@ -158,13 +186,44 @@
   g_signal_connect (G_OBJECT (obj), "response", G_CALLBACK (xfburn_blank_dialog_response_cb), obj);
 }
 
-typedef struct {
-  GtkWidget *dialog_progress;
-  XfburnDevice *device;
-  gint blank_type;
-  gboolean eject;
-} ThreadBlankParams;
+static gboolean is_valid_blank_mode (XfburnDevice *device, XfburnBlankMode mode)
+{
+  int profile_no = xfburn_device_list_get_profile_no ();
+  gboolean erasable = xfburn_device_list_disc_is_erasable ();
+  
+  if (profile_no == 0x14) {
+    /* in 0x14 no blanking is needed, we can only deformat */
+    if (mode == XFBURN_DEFORMAT_FAST || mode == XFBURN_DEFORMAT_COMPLETE)
+      return TRUE;
+    else
+      return FALSE;
+  }
 
+  if (erasable && (mode == XFBURN_BLANK_FAST || mode == XFBURN_BLANK_COMPLETE))
+    return TRUE;
+
+  if (profile_no == 0x13 && (mode == XFBURN_FORMAT_FAST || mode == XFBURN_FORMAT_COMPLETE))
+    return TRUE;
+
+  return FALSE;
+}
+
+/*
+static GList * get_valid_blank_modes (XfburnDevice *device)
+{
+  XfburnBlankMode mode = XFBURN_BLANK_FAST;
+  GList *modes = NULL;
+
+  while (mode < XFBURN_BLANK_MODE_LAST) {
+    if (is_valid_blank_mode (device, mode))
+      modes = g_list_append (modes, GINT_TO_POINTER (mode));
+    mode++;
+  }
+
+  return modes;
+}
+*/
+
 static void
 thread_blank (ThreadBlankParams * params)
 {
@@ -183,7 +242,7 @@
   char severity[80];
   const char *final_status_text;
   XfburnProgressDialogStatus final_status;
-  const char *final_message;
+  gchar *final_message = NULL;
 
   if (!burn_initialize ()) {
     g_critical ("Unable to initialize libburn");
@@ -208,8 +267,11 @@
 
   switch (disc_state) {
   case BURN_DISC_BLANK:
-    xfburn_progress_dialog_burning_failed (XFBURN_PROGRESS_DIALOG (dialog_progress), _("The inserted disc is already blank"));
-    goto cleanup;
+    if (params->blank_mode <= XFBURN_BLANK_COMPLETE) {
+      /* blanking can only be performed on blank discs, format and deformat are allowed to be blank ones */
+      xfburn_progress_dialog_burning_failed (XFBURN_PROGRESS_DIALOG (dialog_progress), _("The inserted disc is already blank"));
+      goto cleanup;
+    }
   case BURN_DISC_FULL:
   case BURN_DISC_APPENDABLE:
     /* these ones we can blank */
@@ -219,8 +281,9 @@
     xfburn_progress_dialog_burning_failed (XFBURN_PROGRESS_DIALOG (dialog_progress), _("No disc detected in the drive"));
     goto cleanup;
   default:
-    xfburn_progress_dialog_burning_failed (XFBURN_PROGRESS_DIALOG (dialog_progress), _("Cannot recognize drive and media state"));
-    goto cleanup;
+    //xfburn_progress_dialog_burning_failed (XFBURN_PROGRESS_DIALOG (dialog_progress), _("Cannot recognize drive and media state"));
+    //goto cleanup;
+    break;
   }
 
   if (!burn_disc_erasable (drive)) {
@@ -234,12 +297,34 @@
   if (ret <= 0)
     g_warning ("Failed to set libburn message severities, burn errors might not get detected!");
  
-  burn_disc_erase(drive, params->blank_type);
+  switch (params->blank_mode) {
+    case XFBURN_BLANK_FAST:
+      burn_disc_erase(drive, 1);
+      break;
+    case XFBURN_BLANK_COMPLETE:
+      burn_disc_erase(drive, 0);
+      break;
+    case XFBURN_FORMAT_FAST:
+      burn_disc_format(drive, 0, 0);
+      break;
+    case XFBURN_FORMAT_COMPLETE:
+      burn_disc_format(drive, XFBURN_FORMAT_COMPLETE_SIZE, 1);
+      break;
+    case XFBURN_DEFORMAT_FAST:
+      burn_disc_erase(drive, 1);
+      break;
+    case XFBURN_DEFORMAT_COMPLETE:
+      burn_disc_erase(drive, 0);
+      break;
+    default:
+      g_error ("Invalid blank mode %d, this is a bug.", params->blank_mode);
+  }
   sleep(1);
 
   xfburn_progress_dialog_set_status_with_text (XFBURN_PROGRESS_DIALOG (dialog_progress), XFBURN_PROGRESS_DIALOG_STATUS_RUNNING, _("Blanking disc..."));
 
-  while (burn_drive_get_status (drive, &progress) != BURN_DRIVE_IDLE) {
+  while ((disc_state = burn_drive_get_status (drive, &progress)) != BURN_DRIVE_IDLE) {
+    //DBG ("disc_state = %d", disc_state);
     if(progress.sectors>0 && progress.sector>=0) {
       gdouble percent = 1.0 + ((gdouble) progress.sector+1.0) / ((gdouble) progress.sectors) * 98.0;
       
@@ -263,7 +348,7 @@
     g_warning ("Fatal error while trying to retrieve libburn message!");
 
   if (G_LIKELY (!error)) {
-    final_message = _("Done");
+    final_message = g_strdup_printf (_("Done"));
     final_status = XFBURN_PROGRESS_DIALOG_STATUS_COMPLETED;
   } else {
     final_status_text  = _("Failure");
@@ -278,6 +363,7 @@
  end:
   burn_finish ();
   g_free (params);
+  g_free (final_message);
 }
 
 static void
@@ -286,7 +372,7 @@
   if (response_id == GTK_RESPONSE_OK) {
     XfburnBlankDialogPrivate *priv = XFBURN_BLANK_DIALOG_GET_PRIVATE (dialog);
     XfburnDevice *device;
-    gint blank_type;
+    XfburnBlankMode blank_mode;
 
     GtkWidget *dialog_progress;
     ThreadBlankParams *params = NULL;
@@ -295,18 +381,25 @@
 
     switch (gtk_combo_box_get_active (GTK_COMBO_BOX (priv->combo_type))) {
     case 0:
-      /* fast blanking */
-      blank_type = 1;
+      blank_mode = XFBURN_BLANK_FAST;
       break;
     case 1:
-      /* normal blanking */
-      blank_type = 0;
+      blank_mode = XFBURN_BLANK_COMPLETE;
       break;
+    case 2:
+      blank_mode = XFBURN_FORMAT_FAST;
+      break;
+    case 3:
+      blank_mode = XFBURN_FORMAT_COMPLETE;
+      break;
     default:
-      blank_type = 1;
+      DBG ("Invalid blank mode selected, falling back to complete blank");
+      blank_mode = XFBURN_BLANK_COMPLETE;
     }
         
     dialog_progress = xfburn_progress_dialog_new (GTK_WINDOW (dialog));
+    g_object_set (dialog_progress, "animate", TRUE, NULL);
+
     gtk_widget_hide (GTK_WIDGET (dialog));
 
     gtk_widget_show (dialog_progress);
@@ -314,7 +407,7 @@
     params = g_new0 (ThreadBlankParams, 1);
     params->dialog_progress = dialog_progress;
     params->device = device;
-    params->blank_type = blank_type;
+    params->blank_mode = blank_mode;
     params->eject = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->check_eject)); 
     g_thread_create ((GThreadFunc) thread_blank, params, FALSE, NULL);
   }




More information about the Goodies-commits mailing list