[brasero] Fix #602181 - Add a parameter to specify the drive you want to use
- From: Philippe Rouquier <philippr src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [brasero] Fix #602181 - Add a parameter to specify the drive you want to use
- Date: Sun, 29 Nov 2009 21:36:43 +0000 (UTC)
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, ©_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]