[brasero] Fix #602181 - Add a parameter to specify the drive you want to use



commit e2c91ee89c482032da5d06705b241a942f9bf62a
Author: Philippe Rouquier <bonfire-app wanadoo fr>
Date:   Sun Nov 29 21:20:53 2009 +0100

    Fix #602181 -  Add a parameter to specify the drive you want to use
    This adds and reorganizes command line parameters:
    --device to specify the burning device
    --file-image when an image should be created
    --immediately when brasero should start burning immediately

 libbrasero-burn/brasero-burn-dialog.c    |   71 +++++-
 libbrasero-burn/brasero-burn-options.c   |   13 +-
 libbrasero-burn/brasero-session-cfg.c    |    2 +-
 libbrasero-burn/brasero-session.c        |   14 +-
 libbrasero-burn/brasero-src-image.c      |    2 +-
 libbrasero-burn/brasero-status-dialog.c  |    4 +-
 libbrasero-burn/brasero-status.c         |   32 +++
 libbrasero-burn/brasero-status.h         |    5 +
 libbrasero-burn/brasero-track-data-cfg.c |   11 +-
 src/brasero-app.c                        |  415 +++++++++++++++++++++++++-----
 src/brasero-app.h                        |   35 +++-
 src/brasero-audio-disc.c                 |    2 +-
 src/brasero-data-disc.c                  |   11 +-
 src/brasero-project-manager.c            |  143 ++---------
 src/brasero-project-manager.h            |   30 +--
 src/brasero-project-parse.c              |    2 +
 src/brasero-project.c                    |   33 +--
 src/brasero-project.h                    |    8 +-
 src/brasero-video-disc.c                 |    2 +-
 src/brasero-video-tree-model.c           |   10 +-
 src/main.c                               |  397 +++++++++++++++--------------
 21 files changed, 775 insertions(+), 467 deletions(-)
---
diff --git a/libbrasero-burn/brasero-burn-dialog.c b/libbrasero-burn/brasero-burn-dialog.c
index a35ef1c..8a0c273 100644
--- a/libbrasero-burn/brasero-burn-dialog.c
+++ b/libbrasero-burn/brasero-burn-dialog.c
@@ -104,6 +104,8 @@ struct BraseroBurnDialogPrivate {
 	gint64 total_size;
 	GSList *rates;
 
+	GMainLoop *loop;
+	gint wait_ready_state_id;
 	GCancellable *cancel_plugin;
 
 	gchar *initial_title;
@@ -2118,17 +2120,18 @@ brasero_burn_dialog_record_session (BraseroBurnDialog *dialog)
 }
 
 static gboolean
-brasero_burn_dialog_wait_for_ready_state (BraseroBurnDialog *dialog)
+brasero_burn_dialog_wait_for_ready_state_cb (BraseroBurnDialog *dialog)
 {
 	BraseroBurnDialogPrivate *priv;
-	BraseroBurnResult result;
 	BraseroStatus *status;
 
 	priv = BRASERO_BURN_DIALOG_PRIVATE (dialog);
 
 	status = brasero_status_new ();
-	result = brasero_burn_session_get_status (priv->session, status);
-	while (brasero_status_get_result (status) == BRASERO_BURN_NOT_READY) {
+	brasero_burn_session_get_status (priv->session, status);
+
+	if (brasero_status_get_result (status) == BRASERO_BURN_NOT_READY
+	||  brasero_status_get_result (status) == BRASERO_BURN_RUNNING) {
 		gdouble progress;
 		gchar *action;
 
@@ -2147,9 +2150,56 @@ brasero_burn_dialog_wait_for_ready_state (BraseroBurnDialog *dialog)
 							   progress,
 							   -1.0,
 							   priv->media);
+		g_object_unref (status);
+
+		/* Continue */
+		return TRUE;
+	}
+
+	if (priv->loop)
+		g_main_loop_quit (priv->loop);
+
+	priv->wait_ready_state_id = 0;
+
+	g_object_unref (status);
+	return FALSE;
+}
+
+static gboolean
+brasero_burn_dialog_wait_for_ready_state (BraseroBurnDialog *dialog)
+{
+	BraseroBurnDialogPrivate *priv;
+	BraseroBurnResult result;
+	BraseroStatus *status;
 
+	priv = BRASERO_BURN_DIALOG_PRIVATE (dialog);
+
+	status = brasero_status_new ();
+	result = brasero_burn_session_get_status (priv->session, status);
+	if (result == BRASERO_BURN_NOT_READY || result == BRASERO_BURN_RUNNING) {
+		GMainLoop *loop;
+
+		loop = g_main_loop_new (NULL, FALSE);
+		priv->loop = loop;
+
+		priv->wait_ready_state_id = g_timeout_add_seconds (1,
+								   (GSourceFunc) brasero_burn_dialog_wait_for_ready_state_cb,
+								   dialog);
+		g_main_loop_run (loop);
+
+		priv->loop = NULL;
+
+		if (priv->wait_ready_state_id) {
+			g_source_remove (priv->wait_ready_state_id);
+			priv->wait_ready_state_id = 0;
+		}
+
+		g_main_loop_unref (loop);
+
+		/* Get the final status */
 		result = brasero_burn_session_get_status (priv->session, status);
 	}
+
 	g_object_unref (status);
 
 	return (result == BRASERO_BURN_OK);
@@ -2295,6 +2345,9 @@ brasero_burn_dialog_run (BraseroBurnDialog *dialog,
 	brasero_burn_session_get_input_type (session, &priv->input);
 	brasero_burn_dialog_update_media (dialog);
 
+	/* show it early */
+	gtk_widget_show (GTK_WIDGET (dialog));
+
 	/* wait for ready state */
 	if (!brasero_burn_dialog_wait_for_ready_state (dialog))
 		return FALSE;
@@ -2397,6 +2450,11 @@ brasero_burn_dialog_cancel (BraseroBurnDialog *dialog,
 
 	priv = BRASERO_BURN_DIALOG_PRIVATE (dialog);
 
+	if (priv->loop) {
+		g_main_loop_quit (priv->loop);
+		return TRUE;
+	}
+
 	if (!priv->burn)
 		return TRUE;
 
@@ -2552,6 +2610,11 @@ brasero_burn_dialog_finalize (GObject * object)
 
 	priv = BRASERO_BURN_DIALOG_PRIVATE (object);
 
+	if (priv->wait_ready_state_id) {
+		g_source_remove (priv->wait_ready_state_id);
+		priv->wait_ready_state_id = 0;
+	}
+
 	if (priv->cancel_plugin) {
 		g_cancellable_cancel (priv->cancel_plugin);
 		priv->cancel_plugin = NULL;
diff --git a/libbrasero-burn/brasero-burn-options.c b/libbrasero-burn/brasero-burn-options.c
index 66d0381..847cef9 100644
--- a/libbrasero-burn/brasero-burn-options.c
+++ b/libbrasero-burn/brasero-burn-options.c
@@ -266,8 +266,14 @@ brasero_burn_options_not_ready_dialog_cancel_cb (GtkDialog *dialog,
 		priv->not_ready_id = 0;
 	}
 	gtk_widget_set_sensitive (GTK_WIDGET (data), TRUE);
-	gtk_dialog_response (GTK_DIALOG (data),
-	                     GTK_RESPONSE_CANCEL);
+
+	if (response != GTK_RESPONSE_OK)
+		gtk_dialog_response (GTK_DIALOG (data),
+				     GTK_RESPONSE_CANCEL);
+	else {
+		priv->status_dialog = NULL;
+		gtk_widget_destroy (GTK_WIDGET (dialog));
+	}		
 }
 
 static gboolean
@@ -1015,9 +1021,6 @@ brasero_burn_options_set_property (GObject *object,
 		brasero_burn_options_build_contents (BRASERO_BURN_OPTIONS (object));
 		brasero_burn_options_setup (BRASERO_BURN_OPTIONS (object));
 
-		/* Only try to set a better drive if there isn't one already set */
-		if (!brasero_burn_session_get_burner (BRASERO_BURN_SESSION (priv->session)))
-			brasero_dest_selection_choose_best (BRASERO_DEST_SELECTION (priv->selection));
 		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
diff --git a/libbrasero-burn/brasero-session-cfg.c b/libbrasero-burn/brasero-session-cfg.c
index 5d25355..571eed1 100644
--- a/libbrasero-burn/brasero-session-cfg.c
+++ b/libbrasero-burn/brasero-session-cfg.c
@@ -1051,7 +1051,7 @@ brasero_session_cfg_update (BraseroSessionCfg *self)
 	/* Make sure the session is ready */
 	status = brasero_status_new ();
 	result = brasero_burn_session_get_status (BRASERO_BURN_SESSION (self), status);
-	if (result == BRASERO_BURN_NOT_READY) {
+	if (result == BRASERO_BURN_NOT_READY || result == BRASERO_BURN_RUNNING) {
 		g_object_unref (status);
 
 		priv->is_valid = BRASERO_SESSION_NOT_READY;
diff --git a/libbrasero-burn/brasero-session.c b/libbrasero-burn/brasero-session.c
index ed69b1e..50bd07c 100644
--- a/libbrasero-burn/brasero-session.c
+++ b/libbrasero-burn/brasero-session.c
@@ -511,6 +511,7 @@ brasero_burn_session_get_status (BraseroBurnSession *session,
 				 BraseroStatus *status)
 {
 	BraseroBurnSessionPrivate *priv;
+	BraseroMediumMonitor *monitor;
 	BraseroStatus *track_status;
 	gdouble num_tracks = 0.0;
 	gdouble done = -1.0;
@@ -524,6 +525,17 @@ brasero_burn_session_get_status (BraseroBurnSession *session,
 		return BRASERO_BURN_ERR;
 
 	track_status = brasero_status_new ();
+
+	/* Make sure that libbrasero-media is initialized */
+	monitor = brasero_medium_monitor_get_default ();
+	if (brasero_medium_monitor_is_probing (monitor)) {
+		BRASERO_BURN_LOG ("Media library not ready yet");
+		brasero_status_set_not_ready (status, -1, NULL);
+		g_object_unref (monitor);
+		return BRASERO_BURN_NOT_READY;
+	}
+	g_object_unref (monitor);
+
 	for (iter = priv->tracks; iter; iter = iter->next) {
 		BraseroTrack *track;
 		BraseroBurnResult result;
@@ -532,7 +544,7 @@ brasero_burn_session_get_status (BraseroBurnSession *session,
 		result = brasero_track_get_status (track, track_status);
 		num_tracks ++;
 
-		if (result == BRASERO_BURN_NOT_READY)
+		if (result == BRASERO_BURN_NOT_READY || result == BRASERO_BURN_RUNNING)
 			not_ready ++;
 		else if (result != BRASERO_BURN_OK) {
 			g_object_unref (track_status);
diff --git a/libbrasero-burn/brasero-src-image.c b/libbrasero-burn/brasero-src-image.c
index 68cdbb8..b7d4d8a 100644
--- a/libbrasero-burn/brasero-src-image.c
+++ b/libbrasero-burn/brasero-src-image.c
@@ -223,7 +223,7 @@ brasero_src_image_update (BraseroSrcImage *self)
 	/* See if information retrieval went fine and/or is ready */
 	status = brasero_status_new ();
 	result = brasero_track_get_status (BRASERO_TRACK (priv->track), status);
-	if (result == BRASERO_BURN_NOT_READY) {
+	if (result == BRASERO_BURN_NOT_READY || result == BRASERO_BURN_RUNNING) {
 		/* Translators: %s is a path */
 		string = g_strdup_printf (_("\"%s\": loading"), name);
 		gtk_widget_set_tooltip_text (GTK_WIDGET (self), NULL);
diff --git a/libbrasero-burn/brasero-status-dialog.c b/libbrasero-burn/brasero-status-dialog.c
index b10da8b..45eb761 100644
--- a/libbrasero-burn/brasero-status-dialog.c
+++ b/libbrasero-burn/brasero-status-dialog.c
@@ -172,7 +172,7 @@ brasero_status_dialog_wait_for_ready_state (BraseroStatusDialog *dialog)
 	status = brasero_status_new ();
 	result = brasero_burn_session_get_status (priv->session, status);
 
-	if (result != BRASERO_BURN_NOT_READY) {
+	if (result != BRASERO_BURN_NOT_READY && result != BRASERO_BURN_RUNNING) {
 		brasero_status_dialog_session_ready (dialog);
 		g_object_unref (status);
 		priv->id = 0;
@@ -373,7 +373,7 @@ brasero_status_dialog_wait_for_session (BraseroStatusDialog *dialog)
 	/* Make sure we really need to run this dialog */
 	status = brasero_status_new ();
 	result = brasero_burn_session_get_status (priv->session, status);
-	if (result != BRASERO_BURN_NOT_READY) {
+	if (result != BRASERO_BURN_NOT_READY && result != BRASERO_BURN_RUNNING) {
 		brasero_status_dialog_session_ready (dialog);
 		g_object_unref (status);
 		return;
diff --git a/libbrasero-burn/brasero-status.c b/libbrasero-burn/brasero-status.c
index 81d898e..13bc1aa 100644
--- a/libbrasero-burn/brasero-status.c
+++ b/libbrasero-burn/brasero-status.c
@@ -243,6 +243,38 @@ brasero_status_set_not_ready (BraseroStatus *status,
 }
 
 /**
+ * brasero_status_set_running:
+ * @status: a #BraseroStatus.
+ * @progress: a #gdouble or -1.0.
+ * @current_action: a #gchar or NULL.
+ *
+ * Sets the status for a request to BRASERO_BURN_RUNNING.
+ * Allows to set a string describing the operation currently performed
+ * as well as the progress regarding the operation completion.
+ *
+ **/
+
+void
+brasero_status_set_running (BraseroStatus *status,
+			    gdouble progress,
+			    const gchar *current_action)
+{
+	BraseroStatusPrivate *priv;
+
+	g_return_if_fail (status != NULL);
+	g_return_if_fail (BRASERO_IS_STATUS (status));
+
+	priv = BRASERO_STATUS_PRIVATE (status);
+
+	priv->res = BRASERO_BURN_RUNNING;
+	priv->progress = progress;
+
+	if (priv->current_action)
+		g_free (priv->current_action);
+	priv->current_action = g_strdup (current_action);
+}
+
+/**
  * brasero_status_set_error:
  * @status: a #BraseroStatus.
  * @error: a #GError or NULL.
diff --git a/libbrasero-burn/brasero-status.h b/libbrasero-burn/brasero-status.h
index 12932fa..ec3cdc5 100644
--- a/libbrasero-burn/brasero-status.h
+++ b/libbrasero-burn/brasero-status.h
@@ -94,6 +94,11 @@ brasero_status_set_not_ready (BraseroStatus *status,
 			      const gchar *current_action);
 
 void
+brasero_status_set_running (BraseroStatus *status,
+			    gdouble progress,
+			    const gchar *current_action);
+
+void
 brasero_status_set_error (BraseroStatus *status,
 			  GError *error);
 
diff --git a/libbrasero-burn/brasero-track-data-cfg.c b/libbrasero-burn/brasero-track-data-cfg.c
index e949a6e..b209e99 100644
--- a/libbrasero-burn/brasero-track-data-cfg.c
+++ b/libbrasero-burn/brasero-track-data-cfg.c
@@ -2423,10 +2423,9 @@ brasero_track_data_cfg_get_status (BraseroTrack *track,
 	 * yet in the project and therefore project will look empty */
 	if (brasero_data_vfs_is_active (BRASERO_DATA_VFS (priv->tree))) {
 		if (status)
-			brasero_status_set_not_ready (status,
-						      -1.0,
-						      _("Analysing files"));
-
+			brasero_status_set_running (status,
+						    -1.0,
+						    _("Analysing files"));
 		return BRASERO_BURN_NOT_READY;
 	}
 
@@ -2508,10 +2507,10 @@ brasero_track_data_cfg_image_uri_cb (BraseroDataVFS *vfs,
 	g_value_init (params, G_TYPE_STRING);
 	g_value_set_string (params, uri);
 
-	/* default to CANCEL */
+	/* default to OK (for addition) */
 	return_value.g_type = 0;
 	g_value_init (&return_value, G_TYPE_INT);
-	g_value_set_int (&return_value, BRASERO_BURN_CANCEL);
+	g_value_set_int (&return_value, BRASERO_BURN_OK);
 
 	g_signal_emitv (instance_and_params,
 			brasero_track_data_cfg_signals [IMAGE],
diff --git a/src/brasero-app.c b/src/brasero-app.c
index 0216014..0504631 100644
--- a/src/brasero-app.c
+++ b/src/brasero-app.c
@@ -50,10 +50,13 @@
 #include "brasero-burn.h"
 #include "brasero-track-disc.h"
 #include "brasero-track-image.h"
+#include "brasero-track-data-cfg.h"
+#include "brasero-track-stream-cfg.h"
 #include "brasero-track-image-cfg.h"
 #include "brasero-session.h"
 #include "brasero-burn-lib.h"
 
+#include "brasero-status-dialog.h"
 #include "brasero-burn-options.h"
 #include "brasero-burn-dialog.h"
 #include "brasero-jacket-edit.h"
@@ -510,7 +513,6 @@ brasero_app_set_parent (BraseroApp *app,
 	BraseroAppPrivate *priv;
 
 	priv = BRASERO_APP_PRIVATE (app);
-
 	priv->parent = gdk_window_foreign_new (parent_xid);
 }
 
@@ -532,7 +534,6 @@ brasero_app_burn (BraseroApp *app,
 
 	brasero_app_set_toplevel (app, GTK_WINDOW (dialog));
 	success = brasero_burn_dialog_run (BRASERO_BURN_DIALOG (dialog), session);
-
 	priv->burn_dialog = NULL;
 
 	/* The destruction of the dialog will bring the main window forward */
@@ -558,47 +559,75 @@ brasero_app_burn_options (BraseroApp *app,
 	return (result == GTK_RESPONSE_OK);
 }
 
-void
-brasero_app_burn_image (BraseroApp *app,
-			const gchar *uri)
+static void
+brasero_app_session_burn (BraseroApp *app,
+			  BraseroSessionCfg *session,
+			  gboolean burn)
 {
-	BraseroSessionCfg *session;
-	BraseroTrackImageCfg *track;
+	/* We need to have a drive to start burning immediately */
+	if (burn && brasero_burn_session_get_burner (BRASERO_BURN_SESSION (session))) {
+		BraseroStatus *status;
+		BraseroBurnResult result;
 
-	/* setup, show, and run options dialog */
-	session = brasero_session_cfg_new ();
+		status = brasero_status_new ();
+		brasero_burn_session_get_status (BRASERO_BURN_SESSION (session), status);
 
-	track = brasero_track_image_cfg_new ();
-	if (uri)
-		brasero_track_image_cfg_set_source (track, uri);
+		result = brasero_status_get_result (status);
+		if (result == BRASERO_BURN_NOT_READY || result == BRASERO_BURN_RUNNING) {
+			GtkWidget *status_dialog;
 
-	brasero_burn_session_add_track (BRASERO_BURN_SESSION (session),
-					BRASERO_TRACK (track),
-					NULL);
+			status_dialog = brasero_status_dialog_new (BRASERO_BURN_SESSION (session), NULL);
+			gtk_dialog_run (GTK_DIALOG (status_dialog));
+			gtk_widget_destroy (status_dialog);
 
-	if (brasero_app_burn_options (app, session))
-		brasero_app_burn (app, BRASERO_BURN_SESSION (session));
+			brasero_burn_session_get_status (BRASERO_BURN_SESSION (session), status);
+			result = brasero_status_get_result (status);
+		}
+		g_object_unref (status);
 
-	g_object_unref (session);
+		if (result == BRASERO_BURN_CANCEL)
+			return;
+
+		if (result != BRASERO_BURN_OK) {
+			GError *error;
+
+			error = brasero_status_get_error (status);
+			brasero_app_alert (app,
+					   _("Error while burning."),
+					   error? error->message:"",
+					   GTK_MESSAGE_ERROR);
+			if (error)
+				g_error_free (error);
+
+			return;
+		}
+
+		brasero_app_burn (app, BRASERO_BURN_SESSION (session));
+	}
+	else if (brasero_app_burn_options (app, session))
+		brasero_app_burn (app, BRASERO_BURN_SESSION (session));
 }
 
 void
 brasero_app_copy_disc (BraseroApp *app,
+		       BraseroDrive *burner,
 		       const gchar *device,
-		       const gchar *cover)
+		       const gchar *cover,
+		       gboolean burn)
 {
+	BraseroTrackDisc *track = NULL;
 	BraseroSessionCfg *session;
-	BraseroTrackDisc *track;
+	BraseroDrive *drive = NULL;
 
 	session = brasero_session_cfg_new ();
 	track = brasero_track_disc_new ();
 	brasero_burn_session_add_track (BRASERO_BURN_SESSION (session),
 					BRASERO_TRACK (track),
 					NULL);
+	g_object_unref (track);
 
 	/* if a device is specified then get the corresponding medium */
 	if (device) {
-		BraseroDrive *drive;
 		BraseroMediumMonitor *monitor;
 
 		monitor = brasero_medium_monitor_get_default ();
@@ -621,15 +650,284 @@ brasero_app_copy_disc (BraseroApp *app,
 					      value);
 	}
 
-	if (brasero_app_burn_options (app, session))
-		brasero_app_burn (app, BRASERO_BURN_SESSION (session));
+	brasero_burn_session_set_burner (BRASERO_BURN_SESSION (session), burner);
+	brasero_app_session_burn (app, session, burn);
+	g_object_unref (session);
+}
+
+void
+brasero_app_image (BraseroApp *app,
+		   BraseroDrive *burner,
+		   const gchar *uri_arg,
+		   gboolean burn)
+{
+	BraseroSessionCfg *session;
+	BraseroTrackImageCfg *track = NULL;
+
+	/* setup, show, and run options dialog */
+	session = brasero_session_cfg_new ();
+	track = brasero_track_image_cfg_new ();
+	brasero_burn_session_add_track (BRASERO_BURN_SESSION (session),
+					BRASERO_TRACK (track),
+					NULL);
+	g_object_unref (track);
+
+	if (uri_arg) {
+		GFile *file;
+		gchar *uri;
+
+		file = g_file_new_for_commandline_arg (uri_arg);
+		uri = g_file_get_uri (file);
+		g_object_unref (file);
+
+		brasero_track_image_cfg_set_source (track, uri);
+		g_free (uri);
+	}
+
+	brasero_burn_session_set_burner (BRASERO_BURN_SESSION (session), burner);
+	brasero_app_session_burn (app, session, burn);
+	g_object_unref (session);
+}
+
+static void
+brasero_app_process_session (BraseroApp *app,
+			     BraseroSessionCfg *session,
+			     gboolean burn)
+{
+	if (!burn) {
+		GtkWidget *manager;
+		BraseroAppPrivate *priv;
+
+		priv = BRASERO_APP_PRIVATE (app);
+		if (!priv->mainwin)
+			brasero_app_create_mainwin (app);
+
+		manager = brasero_app_get_project_manager (app);
+		brasero_project_manager_open_session (BRASERO_PROJECT_MANAGER (manager), session);
+	}
+	else
+		brasero_app_session_burn (app, session, TRUE);
+}
+
+void
+brasero_app_burn_uri (BraseroApp *app,
+		      BraseroDrive *burner,
+		      gboolean burn)
+{
+	GFileEnumerator *enumerator;
+	BraseroSessionCfg *session;
+	BraseroTrackDataCfg *track;
+	GFileInfo *info = NULL;
+	GError *error = NULL;
+	GFile *file;
+
+	/* Here we get the contents from the burn:// URI and add them
+	 * individually to the data project. This is done in case it is
+	 * empty no to start the "Getting Project Size" dialog and then
+	 * show the "Project is empty" dialog. Do this synchronously as:
+	 * - we only want the top nodes which reduces time needed
+	 * - it's always local
+	 * - windows haven't been shown yet
+	 * NOTE: don't use any file specified on the command line. */
+	file = g_file_new_for_uri ("burn://");
+	enumerator = g_file_enumerate_children (file,
+						G_FILE_ATTRIBUTE_STANDARD_NAME,
+						G_FILE_QUERY_INFO_NONE,
+						NULL,
+						&error);
+	if (!enumerator) {
+		gchar *string;
+
+		if (error) {
+			string = g_strdup (error->message);
+			g_error_free (error);
+		}
+		else
+			string = g_strdup (_("An internal error occurred"));
+
+		brasero_app_alert (app,
+				   _("Error while loading the project"),
+				   string,
+				   GTK_MESSAGE_ERROR);
+
+		g_free (string);
+		g_object_unref (file);
+		return;
+	}
+
+	session = brasero_session_cfg_new ();
+
+	track = brasero_track_data_cfg_new ();
+	brasero_burn_session_add_track (BRASERO_BURN_SESSION (session), BRASERO_TRACK (track), NULL);
+	g_object_unref (track);
+
+	while ((info = g_file_enumerator_next_file (enumerator, NULL, &error)) != NULL) {
+		gchar *uri;
+
+		uri = g_strconcat ("burn:///", g_file_info_get_name (info), NULL);
+		g_object_unref (info);
+
+		brasero_track_data_cfg_add (track, uri, NULL);
+		g_free (uri);
+	}
+
+	g_object_unref (enumerator);
+	g_object_unref (file);
 
+	if (error) {
+		g_object_unref (session);
+
+		/* NOTE: this check errors in g_file_enumerator_next_file () */
+		brasero_app_alert (app,
+				   _("Error while loading the project"),
+				   error->message,
+				   GTK_MESSAGE_ERROR);
+		return;
+	}
+
+	if (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (track), NULL) == 0) {
+	        g_object_unref (session);
+		brasero_app_alert (app,
+				   _("Please add files to the project."),
+				   _("The project is empty"),
+				   GTK_MESSAGE_ERROR);
+		return;
+	}
+
+	brasero_burn_session_set_burner (BRASERO_BURN_SESSION (session), burner);
+	brasero_app_process_session (app, session, burn);
+	g_object_unref (session);
+}
+
+void
+brasero_app_data (BraseroApp *app,
+		  BraseroDrive *burner,
+		  gchar * const *uris,
+		  gboolean burn)
+{
+	BraseroTrackDataCfg *track;
+	BraseroSessionCfg *session;
+	BraseroAppPrivate *priv;
+	int i, num;
+
+	priv = BRASERO_APP_PRIVATE (app);
+
+	if (!uris) {
+		GtkWidget *manager;
+
+		if (burn) {
+			brasero_app_alert (app,
+					   _("Please add files to the project."),
+					   _("The project is empty"),
+					   GTK_MESSAGE_ERROR);
+			return;
+		}
+
+		if (!priv->mainwin)
+			brasero_app_create_mainwin (app);
+
+		manager = brasero_app_get_project_manager (app);
+		brasero_project_manager_switch (BRASERO_PROJECT_MANAGER (manager),
+						BRASERO_PROJECT_TYPE_DATA,
+						TRUE);
+		return;
+	}
+
+	session = brasero_session_cfg_new ();
+	track = brasero_track_data_cfg_new ();
+	brasero_burn_session_add_track (BRASERO_BURN_SESSION (session), BRASERO_TRACK (track), NULL);
+	g_object_unref (track);
+
+	num = g_strv_length ((gchar **) uris);
+	for (i = 0; i < num; i ++) {
+		GFile *file;
+		gchar *uri;
+
+		file = g_file_new_for_commandline_arg (uris [i]);
+		uri = g_file_get_uri (file);
+		g_object_unref (file);
+
+		if (!brasero_track_data_cfg_add (track, uri, NULL)) {
+			g_free (uri);
+			g_object_unref (session);
+			return;
+		}
+
+		g_free (uri);
+	}
+
+	brasero_burn_session_set_burner (BRASERO_BURN_SESSION (session), burner);
+	brasero_app_process_session (app, session, burn);
+	g_object_unref (session);
+}
+
+void
+brasero_app_stream (BraseroApp *app,
+		    BraseroDrive *burner,
+		    gchar * const *uris,
+		    gboolean is_video,
+		    gboolean burn)
+{
+	BraseroSessionCfg *session;
+	BraseroAppPrivate *priv;
+	int i, num;
+
+	priv = BRASERO_APP_PRIVATE (app);
+
+	session = brasero_session_cfg_new ();
+
+	if (!uris) {
+		GtkWidget *manager;
+
+		if (burn) {
+			brasero_app_alert (app,
+					   _("Please add files to the project."),
+					   _("The project is empty"),
+					   GTK_MESSAGE_ERROR);
+			return;
+		}
+
+		if (!priv->mainwin)
+			brasero_app_create_mainwin (app);
+
+		manager = brasero_app_get_project_manager (app);
+		brasero_project_manager_switch (BRASERO_PROJECT_MANAGER (manager),
+						is_video? BRASERO_PROJECT_TYPE_VIDEO:BRASERO_PROJECT_TYPE_AUDIO,
+						TRUE);
+		return;
+	}
+
+	num = g_strv_length ((gchar **) uris);
+	for (i = 0; i < num; i ++) {
+		BraseroTrackStreamCfg *track;
+		GFile *file;
+		gchar *uri;
+
+		file = g_file_new_for_commandline_arg (uris [i]);
+		uri = g_file_get_uri (file);
+		g_object_unref (file);
+
+		track = brasero_track_stream_cfg_new ();
+		brasero_track_stream_set_source (BRASERO_TRACK_STREAM (track), uri);
+		g_free (uri);
+
+		if (is_video)
+			brasero_track_stream_set_format (BRASERO_TRACK_STREAM (track),
+			                                 BRASERO_VIDEO_FORMAT_UNDEFINED);
+
+		brasero_burn_session_add_track (BRASERO_BURN_SESSION (session), BRASERO_TRACK (track), NULL);
+		g_object_unref (track);
+	}
+
+	brasero_burn_session_set_burner (BRASERO_BURN_SESSION (session), burner);
+	brasero_app_process_session (app, session, burn);
 	g_object_unref (session);
 }
 
 void
 brasero_app_blank (BraseroApp *app,
-		   const gchar *device)
+		   BraseroDrive *burner,
+		   gboolean burn)
 {
 	BraseroBlankDialog *dialog;
 	BraseroAppPrivate *priv;
@@ -638,19 +936,11 @@ brasero_app_blank (BraseroApp *app,
 	dialog = brasero_blank_dialog_new ();
 	gtk_window_set_icon_name (GTK_WINDOW (dialog), "brasero");
 
-	if (device) {
-		BraseroDrive *drive;
+	if (burner) {
 		BraseroMedium *medium;
-		BraseroMediumMonitor *monitor;
-
-		monitor = brasero_medium_monitor_get_default ();
-		drive = brasero_medium_monitor_get_drive (monitor, device);
-		g_object_unref (monitor);
-
-		medium = brasero_drive_get_medium (drive);
 
+		medium = brasero_drive_get_medium (burner);
 		brasero_tool_dialog_set_medium (BRASERO_TOOL_DIALOG (dialog), medium);
-		g_object_unref (drive);
 	}
 
 	priv->tool_dialog = GTK_WIDGET (dialog);
@@ -681,7 +971,7 @@ brasero_app_blank (BraseroApp *app,
 static void
 on_erase_cb (GtkAction *action, BraseroApp *app)
 {
-	brasero_app_blank (app, NULL);
+	brasero_app_blank (app, NULL, FALSE);
 }
 
 static void
@@ -712,7 +1002,8 @@ on_eject_cb (GtkAction *action, BraseroApp *app)
 
 void
 brasero_app_check (BraseroApp *app,
-		   const gchar *device)
+		   BraseroDrive *burner,
+		   gboolean burn)
 {
 	BraseroSumDialog *dialog;
 	BraseroAppPrivate *priv;
@@ -724,19 +1015,11 @@ brasero_app_check (BraseroApp *app,
 
 	priv->tool_dialog = GTK_WIDGET (dialog);
 
-	if (device) {
-		BraseroDrive *drive;
+	if (burner) {
 		BraseroMedium *medium;
-		BraseroMediumMonitor *monitor;
-
-		monitor = brasero_medium_monitor_get_default ();
-		drive = brasero_medium_monitor_get_drive (monitor, device);
-		g_object_unref (monitor);
-
-		medium = brasero_drive_get_medium (drive);
 
+		medium = brasero_drive_get_medium (burner);
 		brasero_tool_dialog_set_medium (BRASERO_TOOL_DIALOG (dialog), medium);
-		g_object_unref (drive);
 	}
 
 	if (!priv->mainwin) {
@@ -766,7 +1049,7 @@ brasero_app_check (BraseroApp *app,
 static void
 on_integrity_check_cb (GtkAction *action, BraseroApp *app)
 {
-	brasero_app_check (app, NULL);
+	brasero_app_check (app, NULL, FALSE);
 }
 
 static void
@@ -982,6 +1265,7 @@ on_configure_event_cb (GtkWidget *widget,
 
 gboolean
 brasero_app_open_project (BraseroApp *app,
+			  BraseroDrive *burner,
                           const gchar *uri,
                           gboolean is_playlist,
                           gboolean warn_user,
@@ -997,23 +1281,22 @@ brasero_app_open_project (BraseroApp *app,
 #ifdef BUILD_PLAYLIST
 
 	if (is_playlist) {
-		if (!brasero_project_open_audio_playlist_project (uri, BRASERO_BURN_SESSION (session), warn_user))
+		if (!brasero_project_open_audio_playlist_project (uri,
+								  BRASERO_BURN_SESSION (session),
+								  warn_user))
 			return FALSE;
 	}
 	else
 
 #endif
 	
-	if (!brasero_project_open_project_xml (uri, BRASERO_BURN_SESSION (session), warn_user))
+	if (!brasero_project_open_project_xml (uri,
+					       BRASERO_BURN_SESSION (session),
+					       warn_user))
 		return FALSE;
 
-	if (!priv->projects) {
-		brasero_app_create_mainwin (app);
-		brasero_project_manager_open_session (BRASERO_PROJECT_MANAGER (priv->projects), session, burn);
-		brasero_app_run_mainwin (app);
-	}
-	else
-		brasero_project_manager_open_session (BRASERO_PROJECT_MANAGER (priv->projects), session, burn);
+	brasero_app_process_session (app, session, burn);
+	g_object_unref (session);
 
 	return TRUE;
 }
@@ -1037,7 +1320,12 @@ brasero_app_open_by_mime (BraseroApp *app,
 	 * installed, it's returned as application/xml, so check that too. */
 	if (!strcmp (mime, "application/x-brasero")
 	||  !strcmp (mime, "application/xml"))
-		return brasero_app_open_project (app, uri, FALSE, warn_user, FALSE);
+		return brasero_app_open_project (app,
+						 NULL,
+						 uri,
+						 FALSE,
+						 warn_user,
+						 FALSE);
 
 #ifdef BUILD_PLAYLIST
 
@@ -1045,7 +1333,12 @@ brasero_app_open_by_mime (BraseroApp *app,
 	     ||  !strcmp (mime, "audio/x-ms-asx")
 	     ||  !strcmp (mime, "audio/x-mp3-playlist")
 	     ||  !strcmp (mime, "audio/x-mpegurl"))
-		return brasero_app_open_project (app, uri, TRUE,  warn_user, FALSE);
+		return brasero_app_open_project (app,
+						 NULL,
+						 uri,
+						 TRUE,
+						 warn_user,
+						 FALSE);
 
 #endif
 
@@ -1053,11 +1346,7 @@ brasero_app_open_by_mime (BraseroApp *app,
 	     ||  !strcmp (mime, "application/x-cdrdao-toc")
 	     ||  !strcmp (mime, "application/x-toc")
 	     ||  !strcmp (mime, "application/x-cue")) {
-		if (priv->projects)
-			brasero_project_manager_iso (BRASERO_PROJECT_MANAGER (priv->projects), uri);
-		else
-			brasero_app_burn_image (app, uri);
-
+		brasero_app_image (app, NULL, uri, FALSE);
 		return TRUE;
 	}
 
diff --git a/src/brasero-app.h b/src/brasero-app.h
index 52f4fc4..1604d89 100644
--- a/src/brasero-app.h
+++ b/src/brasero-app.h
@@ -95,24 +95,49 @@ brasero_app_burn_options (BraseroApp *app,
 			  BraseroSessionCfg *session);
 
 void
-brasero_app_burn_image (BraseroApp *app,
-			const gchar *uri);
+brasero_app_burn_uri (BraseroApp *app,
+		      BraseroDrive *burner,
+		      gboolean burn);
+
+void
+brasero_app_data (BraseroApp *app,
+		  BraseroDrive *burner,
+		  gchar * const *uris,
+		  gboolean burn);
+
+void
+brasero_app_stream (BraseroApp *app,
+		    BraseroDrive *burner,
+		    gchar * const *uris,
+		    gboolean is_video,
+		    gboolean burn);
+
+void
+brasero_app_image (BraseroApp *app,
+		   BraseroDrive *burner,
+		   const gchar *uri,
+		   gboolean burn);
 
 void
 brasero_app_copy_disc (BraseroApp *app,
+		       BraseroDrive *burner,
 		       const gchar *device,
-		       const gchar *cover);
+		       const gchar *cover,
+		       gboolean burn);
 
 void
 brasero_app_blank (BraseroApp *app,
-		   const gchar *device);
+		   BraseroDrive *burner,
+		   gboolean burn);
 
 void
 brasero_app_check (BraseroApp *app,
-		   const gchar *device);
+		   BraseroDrive *burner,
+		   gboolean burn);
 
 gboolean
 brasero_app_open_project (BraseroApp *app,
+			  BraseroDrive *burner,
                           const gchar *uri,
                           gboolean is_playlist,
                           gboolean warn_user,
diff --git a/src/brasero-audio-disc.c b/src/brasero-audio-disc.c
index 026d6fd..b6d07ab 100644
--- a/src/brasero-audio-disc.c
+++ b/src/brasero-audio-disc.c
@@ -953,7 +953,7 @@ brasero_audio_disc_session_changed (BraseroSessionCfg *session,
 			continue;
 		}
 
-		if (result == BRASERO_BURN_NOT_READY) {
+		if (result == BRASERO_BURN_NOT_READY || result == BRASERO_BURN_RUNNING) {
 			notready = TRUE;
 			continue;
 		}
diff --git a/src/brasero-data-disc.c b/src/brasero-data-disc.c
index 1d1b433..74b3d0b 100644
--- a/src/brasero-data-disc.c
+++ b/src/brasero-data-disc.c
@@ -591,10 +591,8 @@ static gboolean
 brasero_data_disc_launch_image (gpointer data)
 {
 	gchar *uri = data;
-	GtkWidget *manager;
 
-	manager = brasero_app_get_project_manager (brasero_app_get_default ());
-	brasero_project_manager_iso (BRASERO_PROJECT_MANAGER (manager), uri);
+	brasero_app_image (brasero_app_get_default (), NULL, uri, FALSE);
 	g_free (uri);
 
 	return FALSE;
@@ -1314,6 +1312,7 @@ brasero_data_disc_set_track (BraseroDataDisc *disc,
 {
 	BraseroMedium *loaded_medium;
 	BraseroDataDiscPrivate *priv;
+	BraseroBurnResult result;
 	BraseroStatus *status;
 	GtkWidget *message;
 	gint sort_column;
@@ -1454,15 +1453,15 @@ brasero_data_disc_set_track (BraseroDataDisc *disc,
 
 	status = brasero_status_new ();
 	brasero_track_get_status (BRASERO_TRACK (track), status);
-
-	if (brasero_status_get_result (status) == BRASERO_BURN_OK) {
+	result = brasero_status_get_result (status);
+	if (result == BRASERO_BURN_OK || result == BRASERO_BURN_RUNNING) {
 		g_object_unref (status);
 		gtk_widget_set_sensitive (GTK_WIDGET (priv->tree), TRUE);
 		gtk_widget_set_sensitive (GTK_WIDGET (priv->filter), TRUE);
 		return BRASERO_DISC_OK;
 	}
 
-	if (brasero_status_get_result (status) != BRASERO_BURN_NOT_READY) {
+	if (result != BRASERO_BURN_NOT_READY) {
 		g_object_unref (status);
 		return BRASERO_DISC_ERROR_UNKNOWN;
 	}
diff --git a/src/brasero-project-manager.c b/src/brasero-project-manager.c
index 9dc78d1..7699520 100644
--- a/src/brasero-project-manager.c
+++ b/src/brasero-project-manager.c
@@ -1,3 +1,5 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+
 /***************************************************************************
  *            brasero-project-manager.c
  *
@@ -89,13 +91,6 @@ static void
 brasero_project_manager_open_cb (GtkAction *action, BraseroProjectManager *manager);
 
 static void
-brasero_project_manager_switch (BraseroProjectManager *manager,
-				BraseroProjectType type,
-				GSList *uris,
-				const gchar *uri,
-				gboolean reset);
-
-void
 brasero_project_manager_selected_uris_changed (BraseroURIContainer *container,
 					       BraseroProjectManager *manager);
 
@@ -503,11 +498,9 @@ brasero_project_manager_register_ui (BraseroProjectManager *manager,
    	brasero_layout_register_ui (BRASERO_LAYOUT (manager->priv->layout), ui_manager);
 }
 
-static void
+void
 brasero_project_manager_switch (BraseroProjectManager *manager,
 				BraseroProjectType type,
-				GSList *uris,
-				const gchar *uri,
 				gboolean reset)
 {
 	GtkWidget *toplevel;
@@ -550,7 +543,7 @@ brasero_project_manager_switch (BraseroProjectManager *manager,
 
 		if (reset) {
 			/* tell the BraseroProject object that we want an audio selection */
-			brasero_project_set_audio (BRASERO_PROJECT (manager->priv->project), uris);
+			brasero_project_set_audio (BRASERO_PROJECT (manager->priv->project));
 		}
 
 		if (toplevel)
@@ -564,7 +557,7 @@ brasero_project_manager_switch (BraseroProjectManager *manager,
 
 		if (reset) {
 			/* tell the BraseroProject object that we want a data selection */
-			brasero_project_set_data (BRASERO_PROJECT (manager->priv->project), uris);
+			brasero_project_set_data (BRASERO_PROJECT (manager->priv->project));
 		}
 
 		if (toplevel)
@@ -578,7 +571,7 @@ brasero_project_manager_switch (BraseroProjectManager *manager,
 
 		if (reset) {
 			/* tell the BraseroProject object that we want a data selection */
-			brasero_project_set_video (BRASERO_PROJECT (manager->priv->project), uris);
+			brasero_project_set_video (BRASERO_PROJECT (manager->priv->project));
 		}
 
 		if (toplevel)
@@ -596,10 +589,8 @@ brasero_project_manager_switch (BraseroProjectManager *manager,
 
 		brasero_project_manager_switch (manager,
 						BRASERO_PROJECT_TYPE_INVALID,
-						NULL,
-						NULL,
 						TRUE);
-		brasero_app_burn_image (brasero_app_get_default (), uri);
+		brasero_app_image (brasero_app_get_default (), NULL, NULL, FALSE);
 	}
 	else if (type == BRASERO_PROJECT_TYPE_COPY) {
 		brasero_layout_load (BRASERO_LAYOUT (manager->priv->layout), BRASERO_LAYOUT_NONE);
@@ -613,10 +604,8 @@ brasero_project_manager_switch (BraseroProjectManager *manager,
 
 		brasero_project_manager_switch (manager,
 						BRASERO_PROJECT_TYPE_INVALID,
-						NULL,
-						NULL,
 						TRUE);
-		brasero_app_copy_disc (brasero_app_get_default (), uri, NULL);
+		brasero_app_copy_disc (brasero_app_get_default (), NULL, NULL, NULL, FALSE);
 	}
 }
 
@@ -625,157 +614,62 @@ brasero_project_manager_type_changed_cb (BraseroProjectTypeChooser *chooser,
 					 BraseroProjectType type,
 					 BraseroProjectManager *manager)
 {
-	brasero_project_manager_switch (manager, type, NULL, NULL, TRUE);
+	brasero_project_manager_switch (manager, type, TRUE);
 }
 
 static void
 brasero_project_manager_new_empty_prj_cb (GtkAction *action, BraseroProjectManager *manager)
 {
-	brasero_project_manager_switch (manager, BRASERO_PROJECT_TYPE_INVALID, NULL, NULL, TRUE);
+	brasero_project_manager_switch (manager, BRASERO_PROJECT_TYPE_INVALID, TRUE);
 }
 
 static void
 brasero_project_manager_new_audio_prj_cb (GtkAction *action, BraseroProjectManager *manager)
 {
-	brasero_project_manager_switch (manager, BRASERO_PROJECT_TYPE_AUDIO, NULL, NULL, TRUE);
+	brasero_project_manager_switch (manager, BRASERO_PROJECT_TYPE_AUDIO, TRUE);
 }
 
 static void
 brasero_project_manager_new_data_prj_cb (GtkAction *action, BraseroProjectManager *manager)
 {
-	brasero_project_manager_switch (manager, BRASERO_PROJECT_TYPE_DATA, NULL, NULL, TRUE);
+	brasero_project_manager_switch (manager, BRASERO_PROJECT_TYPE_DATA, TRUE);
 }
 
 static void
 brasero_project_manager_new_video_prj_cb (GtkAction *action, BraseroProjectManager *manager)
 {
-	brasero_project_manager_switch (manager, BRASERO_PROJECT_TYPE_VIDEO, NULL, NULL, TRUE);
+	brasero_project_manager_switch (manager, BRASERO_PROJECT_TYPE_VIDEO, TRUE);
 }
 
 static void
 brasero_project_manager_new_copy_prj_cb (GtkAction *action, BraseroProjectManager *manager)
 {
-	brasero_project_manager_switch (manager, BRASERO_PROJECT_TYPE_COPY, NULL, NULL, TRUE);
+	brasero_project_manager_switch (manager, BRASERO_PROJECT_TYPE_COPY, TRUE);
 }
 
 static void
 brasero_project_manager_new_iso_prj_cb (GtkAction *action, BraseroProjectManager *manager)
 {
-	brasero_project_manager_switch (manager, BRASERO_PROJECT_TYPE_ISO, NULL, NULL, TRUE);
-}
-
-void
-brasero_project_manager_data (BraseroProjectManager *manager,
-			      GSList *uris,
-			      gboolean burn)
-{
-	gchar *burn_URI = NULL;
-
-	/* always add the contents of burn:/// URI if list is empty */
-	if (!uris) {
-		burn_URI = g_strdup ("burn:///");
-		uris = g_slist_prepend (NULL, burn_URI);
-	}
-
-	if (burn) {
-		brasero_project_set_data (BRASERO_PROJECT (manager->priv->project), uris);
-		brasero_project_burn (BRASERO_PROJECT (manager->priv->project));
-	}
-	else
-		brasero_project_manager_switch (manager,
-						BRASERO_PROJECT_TYPE_DATA,
-						uris,
-						NULL,
-						TRUE);
-
-	if (burn_URI) {
-		g_slist_free (uris);
-		g_free (burn_URI);
-	}
-}
-
-void
-brasero_project_manager_audio (BraseroProjectManager *manager,
-			       GSList *uris,
-			       gboolean burn)
-{
-	if (burn) {
-		brasero_project_set_audio (BRASERO_PROJECT (manager->priv->project), uris);
-		brasero_project_burn (BRASERO_PROJECT (manager->priv->project));
-	}
-	else
-		brasero_project_manager_switch (manager,
-						BRASERO_PROJECT_TYPE_AUDIO,
-						uris,
-						NULL,
-						TRUE);
-}
-
-void
-brasero_project_manager_video (BraseroProjectManager *manager,
-			       GSList *uris,
-			       gboolean burn)
-{
-	if (burn) {
-		brasero_project_set_video (BRASERO_PROJECT (manager->priv->project), uris);
-		brasero_project_burn (BRASERO_PROJECT (manager->priv->project));
-	}
-	else
-		brasero_project_manager_switch (manager,
-						BRASERO_PROJECT_TYPE_VIDEO,
-						uris,
-						NULL,
-						TRUE);
-}
-
-void
-brasero_project_manager_copy (BraseroProjectManager *manager,
-			      const gchar *device,
-			      const gchar *cover)
-{
-	brasero_project_manager_switch (manager,
-					BRASERO_PROJECT_TYPE_COPY,
-					NULL,
-					device,
-					TRUE);
-}
-
-void
-brasero_project_manager_iso (BraseroProjectManager *manager,
-			     const gchar *uri)
-{
-	brasero_project_manager_switch (manager,
-					BRASERO_PROJECT_TYPE_ISO,
-					NULL,
-					uri,
-					TRUE);
+	brasero_project_manager_switch (manager, BRASERO_PROJECT_TYPE_ISO, TRUE);
 }
 
 gboolean
 brasero_project_manager_open_session (BraseroProjectManager *manager,
-                                      BraseroSessionCfg *session,
-                                      gboolean burn)
+                                      BraseroSessionCfg *session)
 {
 	GtkAction *action;
 	BraseroProjectType type;
 
 	type = brasero_project_open_session (BRASERO_PROJECT (manager->priv->project), session);
 	if (type == BRASERO_PROJECT_TYPE_INVALID) {
-		brasero_project_manager_switch (manager, BRASERO_PROJECT_TYPE_INVALID, NULL, NULL, TRUE);
+		brasero_project_manager_switch (manager, BRASERO_PROJECT_TYPE_INVALID, TRUE);
 		return FALSE;
 	}
 
 	brasero_project_manager_switch (manager,
 					type,
-					NULL,
-					NULL,
 					FALSE);
 
-	if (burn) {
-		brasero_project_burn (BRASERO_PROJECT (manager->priv->project));
-		return TRUE;
-	}
-
 	action = gtk_action_group_get_action (manager->priv->action_group, "NewChoose");
 	gtk_action_set_sensitive (action, TRUE);
 	return TRUE;
@@ -825,7 +719,7 @@ brasero_project_manager_recent_clicked_cb (BraseroProjectTypeChooser *chooser,
 void
 brasero_project_manager_empty (BraseroProjectManager *manager)
 {
-	brasero_project_manager_switch (manager, BRASERO_PROJECT_TYPE_INVALID, NULL, NULL, TRUE);
+	brasero_project_manager_switch (manager, BRASERO_PROJECT_TYPE_INVALID, TRUE);
 }
 
 static void
@@ -838,6 +732,7 @@ brasero_project_manager_last_saved_clicked_cb (BraseroProjectTypeChooser *choose
 
 		uri = g_filename_to_uri (path, NULL, NULL);
 		brasero_app_open_project (brasero_app_get_default (),
+					  NULL,
 		                          uri,
 		                          FALSE, // not a playlist
 		                          FALSE, // should work so don't warn user
diff --git a/src/brasero-project-manager.h b/src/brasero-project-manager.h
index 27152cf..9fb70f4 100644
--- a/src/brasero-project-manager.h
+++ b/src/brasero-project-manager.h
@@ -1,3 +1,5 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+
 /***************************************************************************
  *            brasero-project-manager.h
  *
@@ -60,30 +62,9 @@ typedef struct {
 GType brasero_project_manager_get_type (void);
 GtkWidget *brasero_project_manager_new (void);
 
-void
-brasero_project_manager_audio (BraseroProjectManager *manager,
-			       GSList *uris,
-			       gboolean burn);
-void
-brasero_project_manager_data (BraseroProjectManager *manager,
-			      GSList *uris,
-			      gboolean burn);
-void
-brasero_project_manager_video (BraseroProjectManager *manager,
-			       GSList *uris,
-			       gboolean burn);
-void
-brasero_project_manager_copy (BraseroProjectManager *manager,
-			      const gchar *device,
-			      const gchar *cover);
-void
-brasero_project_manager_iso (BraseroProjectManager *manager,
-			     const gchar *uri);
-
 gboolean
 brasero_project_manager_open_session (BraseroProjectManager *manager,
-                                      BraseroSessionCfg *session,
-                                      gboolean burn);
+                                      BraseroSessionCfg *session);
 
 void
 brasero_project_manager_empty (BraseroProjectManager *manager);
@@ -102,6 +83,11 @@ void
 brasero_project_manager_register_ui (BraseroProjectManager *manager,
 				     GtkUIManager *ui_manager);
 
+void
+brasero_project_manager_switch (BraseroProjectManager *manager,
+				BraseroProjectType type,
+				gboolean reset);
+
 G_END_DECLS
 
 #endif /* BRASERO_PROJECT_MANAGER_H */
diff --git a/src/brasero-project-parse.c b/src/brasero-project-parse.c
index 404655e..b8e421e 100644
--- a/src/brasero-project-parse.c
+++ b/src/brasero-project-parse.c
@@ -1,3 +1,5 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+
 /***************************************************************************
  *            brasero-project-parse.c
  *
diff --git a/src/brasero-project.c b/src/brasero-project.c
index a2bfe9c..ff62315 100644
--- a/src/brasero-project.c
+++ b/src/brasero-project.c
@@ -880,7 +880,8 @@ brasero_project_is_valid (BraseroSessionCfg *session,
 
 		status = brasero_status_new ();
 		brasero_burn_session_get_status (BRASERO_BURN_SESSION (session), status);
-		if (brasero_status_get_result (status) == BRASERO_BURN_NOT_READY) {
+		if (brasero_status_get_result (status) == BRASERO_BURN_NOT_READY
+		||  brasero_status_get_result (status) == BRASERO_BURN_RUNNING) {
 			cursor = gdk_cursor_new (GDK_WATCH);
 			gdk_window_set_cursor (window, cursor);
 			gdk_cursor_unref (cursor);
@@ -1771,8 +1772,6 @@ brasero_project_switch (BraseroProject *project, BraseroProjectType type)
 							  BRASERO_MEDIA_TYPE_FILE);
 	}
 
-	brasero_dest_selection_choose_best (BRASERO_DEST_SELECTION (project->priv->selection));
-
 	if (project->priv->current) {
 		project->priv->merge_id = brasero_disc_add_ui (project->priv->current,
 							       project->priv->manager,
@@ -1800,46 +1799,24 @@ brasero_project_switch (BraseroProject *project, BraseroProjectType type)
 }
 
 void
-brasero_project_set_audio (BraseroProject *project, GSList *uris)
+brasero_project_set_audio (BraseroProject *project)
 {
 	brasero_project_new_session (project, NULL);
 	brasero_project_switch (project, BRASERO_PROJECT_TYPE_AUDIO);
-
-	for (; uris; uris = uris->next) {
-		gchar *uri;
-
-	    	uri = uris->data;
-		brasero_disc_add_uri (project->priv->current, uri);
-	}
 }
 
 void
-brasero_project_set_data (BraseroProject *project,
-			  GSList *uris)
+brasero_project_set_data (BraseroProject *project)
 {
 	brasero_project_new_session (project, NULL);
 	brasero_project_switch (project, BRASERO_PROJECT_TYPE_DATA);
-
-	for (; uris; uris = uris->next) {
-		gchar *uri;
-
-	    	uri = uris->data;
-		brasero_disc_add_uri (project->priv->current, uri);
-	}
 }
 
 void
-brasero_project_set_video (BraseroProject *project, GSList *uris)
+brasero_project_set_video (BraseroProject *project)
 {
 	brasero_project_new_session (project, NULL);
 	brasero_project_switch (project, BRASERO_PROJECT_TYPE_VIDEO);
-
-	for (; uris; uris = uris->next) {
-		gchar *uri;
-
-	    	uri = uris->data;
-		brasero_disc_add_uri (project->priv->current, uri);
-	}
 }
 
 gboolean
diff --git a/src/brasero-project.h b/src/brasero-project.h
index 9dc7dd1..34fb054 100644
--- a/src/brasero-project.h
+++ b/src/brasero-project.h
@@ -1,3 +1,5 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+
 /***************************************************************************
  *            project.h
  *
@@ -71,11 +73,11 @@ gboolean
 brasero_project_confirm_switch (BraseroProject *project);
 
 void
-brasero_project_set_audio (BraseroProject *project, GSList *uris);
+brasero_project_set_audio (BraseroProject *project);
 void
-brasero_project_set_data (BraseroProject *project, GSList *uris);
+brasero_project_set_data (BraseroProject *project);
 void
-brasero_project_set_video (BraseroProject *project, GSList *uris);
+brasero_project_set_video (BraseroProject *project);
 void
 brasero_project_set_none (BraseroProject *project);
 
diff --git a/src/brasero-video-disc.c b/src/brasero-video-disc.c
index 4259501..24e66c0 100644
--- a/src/brasero-video-disc.c
+++ b/src/brasero-video-disc.c
@@ -480,7 +480,7 @@ brasero_video_disc_session_changed (BraseroSessionCfg *session,
 			continue;
 		}
 
-		if (result == BRASERO_BURN_NOT_READY) {
+		if (result == BRASERO_BURN_NOT_READY || result == BRASERO_BURN_RUNNING) {
 			notready = TRUE;
 			continue;
 		}
diff --git a/src/brasero-video-tree-model.c b/src/brasero-video-tree-model.c
index 9adba9f..9c69106 100644
--- a/src/brasero-video-tree-model.c
+++ b/src/brasero-video-tree-model.c
@@ -154,6 +154,7 @@ brasero_video_tree_model_get_value (GtkTreeModel *model,
 {
 	BraseroVideoTreeModelPrivate *priv;
 	BraseroVideoTreeModel *self;
+	BraseroBurnResult result;
 	BraseroStatus *status;
 	BraseroTrack *track;
 	const gchar *string;
@@ -277,7 +278,8 @@ brasero_video_tree_model_get_value (GtkTreeModel *model,
 		g_value_init (value, G_TYPE_STRING);
 
 		value_tag = NULL;
-		if (brasero_status_get_result (status) == BRASERO_BURN_NOT_READY)
+		result = brasero_status_get_result (status);
+		if (result == BRASERO_BURN_NOT_READY || result == BRASERO_BURN_RUNNING)
 			g_value_set_string (value, "image-loading");
 		else if (brasero_track_tag_lookup (track, BRASERO_TRACK_STREAM_MIME_TAG, &value_tag) == BRASERO_BURN_OK)
 			g_value_set_string (value, g_value_get_string (value_tag));
@@ -292,8 +294,9 @@ brasero_video_tree_model_get_value (GtkTreeModel *model,
 
 		status = brasero_status_new ();
 		brasero_track_get_status (track, status);
+		result = brasero_status_get_result (status);
 
-		if (brasero_status_get_result (status) == BRASERO_BURN_NOT_READY)
+		if (result == BRASERO_BURN_NOT_READY || result == BRASERO_BURN_RUNNING)
 			pixbuf = gtk_icon_theme_load_icon (priv->theme,
 							   "image-loading",
 							   48,
@@ -327,7 +330,8 @@ brasero_video_tree_model_get_value (GtkTreeModel *model,
 
 		g_value_init (value, G_TYPE_STRING);
 
-		if (brasero_status_get_result (status) == BRASERO_BURN_OK) {
+		result = brasero_status_get_result (status);
+		if (result == BRASERO_BURN_OK) {
 			guint64 len = 0;
 
 			brasero_track_stream_get_length (BRASERO_TRACK_STREAM (track), &len);
diff --git a/src/main.c b/src/main.c
index c097f40..4f923f6 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,3 +1,5 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+
 /*
  * Brasero is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -43,9 +45,12 @@
 #include <gst/gst.h>
 #include <gst/pbutils/pbutils.h>
 
+#include "brasero-medium-monitor.h"
+
 #include "brasero-project-manager.h"
 #include "brasero-multi-dnd.h"
 #include "brasero-utils.h"
+#include "brasero-misc.h"
 #include "brasero-app.h"
 
 #include "brasero-burn-lib.h"
@@ -53,21 +58,52 @@
 
 #include "eggsmclient.h"
 
+BraseroDrive *burner = NULL;
+
 gchar *burn_project_uri;
 gchar *project_uri;
 gchar *cover_project;
 gchar *playlist_uri;
-gchar *iso_uri;
+gchar *copy_project_path;
+gchar *image_project_uri;
+
 gchar **files;
+
 gint audio_project;
 gint data_project;
 gint video_project;
-gint copy_project;
 gint empty_project;
-gint disc_blank;
-gint disc_check;
 gint open_ncb;
 gint parent_window;
+gint burn_immediately;
+gint disc_blank;
+gint disc_check;
+
+gboolean copy_project;
+gboolean image_project;
+
+static gboolean
+brasero_main_copy_project (const gchar *option_name,
+                           const gchar *value,
+                           gpointer data,
+                           GError **error);
+static gboolean
+brasero_main_image_project (const gchar *option_name,
+   			    const gchar *value,
+                            gpointer data,
+                            GError **error);
+
+static gboolean
+brasero_main_fake_device (const gchar *option_name,
+			  const gchar *value,
+			  gpointer data,
+			  GError **error);
+
+static gboolean
+brasero_main_burning_device (const gchar *option_name,
+			     const gchar *value,
+			     gpointer data,
+			     GError **error);
 
 static const GOptionEntry options [] = {
 	{ "project", 'p', 0, G_OPTION_ARG_FILENAME, &project_uri,
@@ -82,6 +118,14 @@ static const GOptionEntry options [] = {
 
 #endif
 
+	{ "device", 0, G_OPTION_FLAG_FILENAME, G_OPTION_ARG_CALLBACK, brasero_main_burning_device,
+	  N_("Set the drive to be used for burning"),
+	  N_("DEVICE PATH") },
+
+	{ "image-file", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, brasero_main_fake_device,
+	  N_("Create an image file instead of burning"),
+	  NULL },
+
 	{ "audio", 'a', 0, G_OPTION_ARG_NONE, &audio_project,
 	  N_("Open an audio project adding the URIs given on the command line"),
 	  NULL },
@@ -90,7 +134,7 @@ static const GOptionEntry options [] = {
          N_("Open a data project adding the URIs given on the command line"),
           NULL },
 
-	{ "copy", 'c', 0, G_OPTION_ARG_NONE, &copy_project,
+	{ "copy", 'c', G_OPTION_FLAG_OPTIONAL_ARG|G_OPTION_FLAG_FILENAME, G_OPTION_ARG_CALLBACK, brasero_main_copy_project,
 	  N_("Copy a disc"),
 	  N_("PATH TO DEVICE") },
 
@@ -102,9 +146,9 @@ static const GOptionEntry options [] = {
 	  N_("Open a video project adding the URIs given on the command line"),
 	  NULL },
 
-	{ "image", 'i', 0, G_OPTION_ARG_FILENAME, &iso_uri,
+	{ "image", 'i', G_OPTION_FLAG_OPTIONAL_ARG|G_OPTION_FLAG_FILENAME, G_OPTION_ARG_CALLBACK, brasero_main_image_project,
 	 N_("URI of an image file to burn (autodetected)"),
-          N_("PATH TO PLAYLIST") },
+          N_("PATH TO IMAGE") },
 
     	{ "empty", 'e', 0, G_OPTION_ARG_NONE, &empty_project,
          N_("Force brasero to display the project selection page"),
@@ -112,16 +156,20 @@ static const GOptionEntry options [] = {
 
 	{ "blank", 'b', 0, G_OPTION_ARG_NONE, &disc_blank,
 	  N_("Open the blank disc dialog"),
-	  NULL },
+	  N_("PATH TO DEVICE") },
 
 	{ "check", 'k', 0, G_OPTION_ARG_NONE, &disc_check,
 	  N_("Open the check disc dialog"),
-	  NULL },
+	  N_("PATH TO DEVICE") },
 
 	{ "ncb", 'n', 0, G_OPTION_ARG_NONE, &open_ncb,
 	  N_("Burn the contents of burn:// URI"),
 	  NULL },
 
+	{ "immediately", 0, 0, G_OPTION_ARG_NONE, &burn_immediately,
+	  N_("Start burning immediately."),
+	  NULL },
+
 	{ "burn-and-remove-project", 'r', 0, G_OPTION_ARG_FILENAME, &burn_project_uri,
 	  N_("Burn the specified project and remove it.\nThis option is mainly useful for integration with other applications."),
 	  N_("PATH") },
@@ -140,124 +188,103 @@ static const GOptionEntry options [] = {
 	{ NULL }
 };
 
-#define BRASERO_PROJECT_OPEN_URI(manager_MACRO, function, path)		\
-{									\
-	GFile *file;							\
-	gchar *uri;							\
-	file = g_file_new_for_commandline_arg (path);			\
-	uri = g_file_get_uri (file);					\
-	g_object_unref (file);						\
-	function (BRASERO_PROJECT_MANAGER (manager_MACRO), uri);	\
-}
+static gboolean
+brasero_main_fake_device (const gchar *option_name,
+                          const gchar *value,
+                          gpointer data,
+                          GError **error)
+{
+	BraseroMediumMonitor *monitor;
+	GSList *list;
+
+	/* Wait for the libbrasero-media to be ready */
+	monitor = brasero_medium_monitor_get_default ();
+	while (brasero_medium_monitor_is_probing (monitor))
+		sleep (1);
+
+	list = brasero_medium_monitor_get_drives (monitor, BRASERO_DRIVE_TYPE_FILE);
+	if (!list)
+		return FALSE;
 
-#define BRASERO_PROJECT_OPEN_LIST(manager_MACRO, function_MACRO, uris_MACROS, burn_MACRO)	\
-{										\
-	GSList *list = NULL;							\
-	gchar **iter;								\
-	/* convert all names into a GSList * */					\
-	for (iter = uris_MACROS; iter && *iter; iter ++) {				\
-		gchar *uri;							\
-		GFile *file;							\
-		file = g_file_new_for_commandline_arg (*iter);			\
-		uri = g_file_get_uri (file);					\
-		g_object_unref (file);						\
-		list = g_slist_prepend (list, uri);				\
-	}									\
-	/* reverse to keep the order of files */				\
-	list = g_slist_reverse (list);						\
-	function_MACRO (BRASERO_PROJECT_MANAGER (manager_MACRO), list, burn_MACRO);		\
-	g_slist_foreach (list, (GFunc) g_free, NULL);				\
-	g_slist_free (list);							\
+	burner = list->data;
+	g_slist_free (list);
+
+	return TRUE;
 }
 
-static void
-brasero_handle_burn_uri (BraseroApp *app,
-			 GtkWidget *manager)
+static gboolean
+brasero_main_burning_device (const gchar *option_name,
+			     const gchar *value,
+			     gpointer data,
+			     GError **error)
 {
-	GFileEnumerator *enumerator;
-	GFileInfo *info = NULL;
-	GError *error = NULL;
-	GSList *list = NULL;
-	GFile *file;
-
-	/* Here we get the contents from the burn:// URI and add them
-	 * individually to the data project. This is done in case it is
-	 * empty no to start the "Getting Project Size" dialog and then
-	 * show the "Project is empty" dialog. Do this synchronously as:
-	 * - we only want the top nodes which reduces time needed
-	 * - it's always local
-	 * - windows haven't been shown yet
-	 * NOTE: don't use any file specified on the command line. */
-	file = g_file_new_for_uri ("burn://");
-	enumerator = g_file_enumerate_children (file,
-						G_FILE_ATTRIBUTE_STANDARD_NAME,
-						G_FILE_QUERY_INFO_NONE,
-						NULL,
-						&error);
-
-	if (!enumerator) {
-		gchar *string;
+	BraseroDrive *burner;
+	BraseroMediumMonitor *monitor;
 
-		if (error)
-			string = g_strdup_printf (_("An internal error occurred (%s)"), error->message);
-		else
-			string = g_strdup (_("An internal error occurred"));
+	if (!value)
+		return FALSE;
 
-		brasero_app_alert (app,
-				   _("Error while loading the project"),
-				   string,
-				   GTK_MESSAGE_ERROR);
+	/* Wait for the libbrasero-media to be ready */
+	monitor = brasero_medium_monitor_get_default ();
+	while (brasero_medium_monitor_is_probing (monitor))
+		sleep (1);
 
-		g_free (string);
-		g_object_unref (file);
-		return;
-	}
+	burner = brasero_medium_monitor_get_drive (monitor, value);
+	g_object_unref (monitor);
 
-	while ((info = g_file_enumerator_next_file (enumerator, NULL, &error)) != NULL) {
-		list = g_slist_prepend (list, g_strconcat ("burn:///", g_file_info_get_name (info), NULL));
-		g_object_unref (info);
-	}
+	if (burner) {
+		if (!brasero_drive_can_write (burner)) {
+			gchar *string;
 
-	g_object_unref (enumerator);
-	g_object_unref (file);
+			/* Translators: %s is the path of drive */
+			string = g_strdup_printf (_("\"%s\" cannot write."), value);
+			brasero_utils_message_dialog (NULL,
+						      string,
+						      NULL,
+						      GTK_MESSAGE_ERROR);
 
-	if (error) {
+			g_object_unref (burner);
+			return FALSE;
+		}
+	}
+	else {
 		gchar *string;
 
-		if (error)
-			string = g_strdup_printf (_("An internal error occurred (%s)"), error->message);
-		else
-			string = g_strdup (_("An internal error occurred"));
-
-		brasero_app_alert (app,
-				   _("Error while loading the project"),
-				   string,
-				   GTK_MESSAGE_ERROR);
-
+		/* Translators: %s is the path of a drive */
+		string = g_strdup_printf (_("\"%s\" cannot be found."), value);
+		brasero_utils_message_dialog (NULL,
+					      string,
+					      NULL,
+					      GTK_MESSAGE_ERROR);
 		g_free (string);
-
-		g_slist_foreach (list, (GFunc) g_free, NULL);
-		g_slist_free (list);
-		return;
+		return FALSE;
 	}
 
-	if (!list) {
-		brasero_app_alert (app,
-				   _("Please add files to the project."),
-				   _("The project is empty"),
-				   GTK_MESSAGE_ERROR);
-		return;
-	}
+	return TRUE;
+}
 
-	/* reverse to keep the order of files */
-	list = g_slist_reverse (list);
-	brasero_app_create_mainwin (app);
-	manager = brasero_app_get_project_manager (app);
-	brasero_project_manager_data (BRASERO_PROJECT_MANAGER (manager), list, TRUE);
+static gboolean
+brasero_main_copy_project (const gchar *option_name,
+                           const gchar *value,
+                           gpointer data,
+                           GError **error)
+{
+	copy_project = TRUE;
+	copy_project_path = g_strdup (value);
 
-	g_slist_foreach (list, (GFunc) g_free, NULL);
-	g_slist_free (list);
-	return;
+	return TRUE;
+}
+
+static gboolean
+brasero_main_image_project (const gchar *option_name,
+			    const gchar *value,
+        		    gpointer data,
+	                    GError **error)
+{
+	image_project = TRUE;
+	image_project_uri = g_strdup (value);
+
+	return TRUE;
 }
 
 static void
@@ -278,10 +305,10 @@ brasero_app_parse_options (BraseroApp *app)
 	}
 
 	/* we first check that only one of the options was given
-	 * (except for --debug and cover argument) */
+	 * (except for --debug, cover argument and device) */
 	if (copy_project)
 		nb ++;
-	if (iso_uri)
+	if (image_project)
 		nb ++;
 	if (project_uri)
 		nb ++;
@@ -311,10 +338,21 @@ brasero_app_parse_options (BraseroApp *app)
 		brasero_project_manager_empty (BRASERO_PROJECT_MANAGER (manager));
 	}
 	else if (project_uri) {
-		brasero_app_open_project (app, project_uri, FALSE, TRUE, FALSE);
+		brasero_app_open_project (app,
+					  burner,
+					  project_uri,
+					  FALSE,
+					  TRUE,
+					  burn_immediately != 0);
+		return;
 	}
 	else if (burn_project_uri) {
-		brasero_app_open_project (app, burn_project_uri, FALSE, TRUE, TRUE);
+		brasero_app_open_project (app,
+					  burner,
+					  burn_project_uri,
+					  FALSE,
+					  TRUE,
+					  TRUE);
 
 		if (g_remove (burn_project_uri) != 0) {
 			gchar *path;
@@ -329,91 +367,66 @@ brasero_app_parse_options (BraseroApp *app)
 #ifdef BUILD_PLAYLIST
 
 	else if (playlist_uri) {
-		brasero_app_open_project (app, playlist_uri, TRUE, TRUE, FALSE);
+		brasero_app_open_project (app,
+					  burner,
+					  playlist_uri,
+					  TRUE,
+					  TRUE,
+					  burn_immediately != 0);
+		return;
 	}
 
 #endif
-
-	else if (open_ncb) {
-		brasero_handle_burn_uri (app, manager);
+	else if (copy_project) {
+		brasero_app_copy_disc (app,
+				       burner,
+				       copy_project_path,
+				       cover_project,
+				       burn_immediately != 0);
 		return;
 	}
-	else if (audio_project) {
-		brasero_app_create_mainwin (app);
-		manager = brasero_app_get_project_manager (app);
-		BRASERO_PROJECT_OPEN_LIST (manager, brasero_project_manager_audio, files, FALSE);
-	}
-	else if (data_project) {
-		brasero_app_create_mainwin (app);
-		manager = brasero_app_get_project_manager (app);
-		BRASERO_PROJECT_OPEN_LIST (manager, brasero_project_manager_data, files, FALSE);
-	}
-	else if (video_project) {
-		brasero_app_create_mainwin (app);
-		manager = brasero_app_get_project_manager (app);
-	    	BRASERO_PROJECT_OPEN_LIST (manager, brasero_project_manager_video, files, FALSE);
-	}
-	else if (copy_project) {
-		gchar *device = NULL;
-
-		/* Make sure there is only one file in the remaining list for
-		* specifying the source device. It could be extended to let
-		* the user specify the destination device as well */
-		if (files
-		&&  files [0] != NULL
-		&&  files [1] == NULL)
-			device = files [0]; 
-
-		brasero_app_copy_disc (app, device, cover_project);
+	else if (image_project) {
+		brasero_app_image (app,
+				   burner,
+				   image_project_uri,
+				   burn_immediately != 0);
 		return;
 	}
-	else if (iso_uri) {
-		GFile *file;
-		gchar *uri;
-
-		file = g_file_new_for_commandline_arg (iso_uri);
-		uri = g_file_get_uri (file);
-		g_object_unref (file);
-
-		brasero_app_burn_image (app, uri);
+	else if (open_ncb) {
+		brasero_app_burn_uri (app, burner, burn_immediately != 0);
 		return;
 	}
 	else if (disc_blank) {
-		gchar *device = NULL;
-
-		/* make sure there is only one file in the remaining list for
-		 * specifying the source device. It could be extended to let
-		 * the user specify the destination device as well */
-		if (files
-		&&  files [0] != NULL
-		&&  files [1] == NULL)
-			device = files [0];
-
-		brasero_app_blank (app, device);
+		brasero_app_blank (app, burner, burn_immediately != 0);
 		return;
 	}
 	else if (disc_check) {
-		gchar *device = NULL;
-
-		/* make sure there is only one file in the remaining list for
-		 * specifying the source device. It could be extended to let
-		 * the user specify the destination device as well */
-		if (files
-		&&  files [0] != NULL
-		&&  files [1] == NULL)
-			device = files [0];
-
-		brasero_app_check (app, device);
+		brasero_app_check (app, burner, burn_immediately != 0);
 		return;
 	}
+	else if (audio_project) {
+		brasero_app_stream (app, burner, files, FALSE, burn_immediately != 0);
+		if (burn_immediately)
+			return;
+	}
+	else if (data_project) {
+		brasero_app_data (app, burner, files, burn_immediately != 0);
+		if (burn_immediately)
+			return;
+	}
+	else if (video_project) {
+		brasero_app_stream (app, burner, files, TRUE, burn_immediately != 0);
+		if (burn_immediately)
+			return;
+	}
 	else if (files) {
 		if (g_strv_length (files) == 1
 		&&  brasero_app_open_uri (app, files [0], FALSE))
 			return;
 
-		brasero_app_create_mainwin (app);
-		manager = brasero_app_get_project_manager (app);
-		BRASERO_PROJECT_OPEN_LIST (manager, brasero_project_manager_data, files, FALSE);
+		brasero_app_data (app, burner, files, burn_immediately != 0);
+		if (burn_immediately)
+			return;
 	}
 	else {
 		brasero_app_create_mainwin (app);
@@ -450,6 +463,10 @@ main (int argc, char **argv)
 	g_thread_init (NULL);
 	g_type_init ();
 
+	gtk_init (&argc, &argv);
+
+	brasero_burn_library_start (&argc, &argv);
+
 	context = g_option_context_new (_("[URI] [URI] â?¦"));
 	g_option_context_add_main_entries (context,
 					   options,
@@ -466,20 +483,8 @@ main (int argc, char **argv)
 		g_option_context_free (context);
 		exit (1);
 	}
-
 	g_option_context_free (context);
 
-	/* REMINDER: this is done in burn library now */
-/*	gst_init (&argc, &argv);
-	gst_pb_utils_init ();
-	client = gconf_client_get_default ();
-	gconf_client_add_dir (client,
-			      BRASERO_CONF_DIR,
-			      GCONF_CLIENT_PRELOAD_NONE,
-			      NULL);
-*/
-	brasero_burn_library_start (&argc, &argv);
-
 	brasero_enable_multi_DND ();
 
 	current_app = brasero_app_new ();
@@ -497,3 +502,13 @@ main (int argc, char **argv)
 
 	return 0;
 }
+
+	/* REMINDER: this is done in burn library now */
+/*	gst_init (&argc, &argv);
+	gst_pb_utils_init ();
+	client = gconf_client_get_default ();
+	gconf_client_add_dir (client,
+			      BRASERO_CONF_DIR,
+			      GCONF_CLIENT_PRELOAD_NONE,
+			      NULL);
+*/



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]