[rhythmbox] track-transfer-batch: avoid gtk_dialog_run for overwrite prompt
- From: Jonathan Matthew <jmatthew src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [rhythmbox] track-transfer-batch: avoid gtk_dialog_run for overwrite prompt
- Date: Sat, 25 Feb 2012 14:46:03 +0000 (UTC)
commit af163c03f7721a77917862b9642a24171b58f7ba
Author: Jonathan Matthew <jonathan d14n org>
Date: Sat Feb 25 22:40:32 2012 +1000
track-transfer-batch: avoid gtk_dialog_run for overwrite prompt
Replace the RBEncoder 'overwrite' signal with a parameter to
rb_encoder_encode, and just make it fail if overwrite is FALSE
and the destination file exists.
Change the transfer batch 'overwrite-prompt' signal to suspend
the batch and add a method to resume it, either overwriting the
existing destination file or skipping the track.
This means the overwrite-prompt signal handler doesn't have to
return the user's decision, so it doesn't have to call gtk_dialog_run.
Friends don't let friends gtk_dialog_run.
backends/gstreamer/rb-encoder-gst.c | 20 ++++--
backends/rb-encoder.c | 32 +--------
backends/rb-encoder.h | 7 +-
shell/rb-track-transfer-batch.c | 124 ++++++++++++++++++++++-------------
shell/rb-track-transfer-batch.h | 3 +
shell/rb-track-transfer-queue.c | 83 ++++++++++++++---------
sources/rb-library-source.c | 2 +-
sources/rb-transfer-target.c | 6 +-
8 files changed, 159 insertions(+), 118 deletions(-)
---
diff --git a/backends/gstreamer/rb-encoder-gst.c b/backends/gstreamer/rb-encoder-gst.c
index 72a6eb4..88e0674 100644
--- a/backends/gstreamer/rb-encoder-gst.c
+++ b/backends/gstreamer/rb-encoder-gst.c
@@ -438,6 +438,7 @@ static gboolean
attach_output_pipeline (RBEncoderGst *encoder,
GstElement *end,
const char *dest,
+ gboolean overwrite,
GError **error)
{
GFile *file;
@@ -466,14 +467,18 @@ attach_output_pipeline (RBEncoderGst *encoder,
} else if (g_error_matches (local_error,
G_IO_ERROR,
G_IO_ERROR_EXISTS)) {
- if (_rb_encoder_emit_overwrite (RB_ENCODER (encoder), file)) {
+ if (overwrite) {
g_error_free (local_error);
stream = g_file_replace (file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, error);
if (stream == NULL) {
return FALSE;
}
} else {
- g_propagate_error (error, local_error);
+ g_set_error (error,
+ RB_ENCODER_ERROR,
+ RB_ENCODER_ERROR_DEST_EXISTS,
+ local_error->message);
+ g_error_free (local_error);
return FALSE;
}
} else {
@@ -549,6 +554,7 @@ static gboolean
copy_track (RBEncoderGst *encoder,
RhythmDBEntry *entry,
const char *dest,
+ gboolean overwrite,
GError **error)
{
/* source ! sink */
@@ -560,7 +566,7 @@ copy_track (RBEncoderGst *encoder,
if (src == NULL)
return FALSE;
- if (!attach_output_pipeline (encoder, src, dest, error))
+ if (!attach_output_pipeline (encoder, src, dest, overwrite, error))
return FALSE;
start_pipeline (encoder);
@@ -571,6 +577,7 @@ static gboolean
transcode_track (RBEncoderGst *encoder,
RhythmDBEntry *entry,
const char *dest,
+ gboolean overwrite,
GError **error)
{
/* src ! decodebin2 ! encodebin ! sink */
@@ -616,7 +623,7 @@ transcode_track (RBEncoderGst *encoder,
NULL);
gst_bin_add (GST_BIN (encoder->priv->pipeline), encoder->priv->encodebin);
- if (!attach_output_pipeline (encoder, encoder->priv->encodebin, dest, error))
+ if (!attach_output_pipeline (encoder, encoder->priv->encodebin, dest, overwrite, error))
goto error;
if (!add_tags_from_entry (encoder, entry, error))
goto error;
@@ -680,6 +687,7 @@ static void
impl_encode (RBEncoder *bencoder,
RhythmDBEntry *entry,
const char *dest,
+ gboolean overwrite,
GstEncodingProfile *profile)
{
RBEncoderGst *encoder = RB_ENCODER_GST (bencoder);
@@ -712,7 +720,7 @@ impl_encode (RBEncoder *bencoder,
encoder->priv->position_format = GST_FORMAT_BYTES;
encoder->priv->dest_media_type = rhythmdb_entry_dup_string (entry, RHYTHMDB_PROP_MEDIA_TYPE);
- result = copy_track (encoder, entry, dest, &error);
+ result = copy_track (encoder, entry, dest, overwrite, &error);
} else {
gst_encoding_profile_ref (profile);
encoder->priv->profile = profile;
@@ -720,7 +728,7 @@ impl_encode (RBEncoder *bencoder,
encoder->priv->position_format = GST_FORMAT_TIME;
encoder->priv->dest_media_type = rb_gst_encoding_profile_get_media_type (profile);
- result = transcode_track (encoder, entry, dest, &error);
+ result = transcode_track (encoder, entry, dest, overwrite, &error);
}
if (result == FALSE && encoder->priv->cancelled == FALSE) {
diff --git a/backends/rb-encoder.c b/backends/rb-encoder.c
index 37fff53..3fa1ddf 100644
--- a/backends/rb-encoder.c
+++ b/backends/rb-encoder.c
@@ -52,7 +52,6 @@ enum {
COMPLETED,
PREPARE_SOURCE, /* this is on RBEncoderFactory */
PREPARE_SINK, /* this is on RBEncoderFactory */
- OVERWRITE,
LAST_SIGNAL
};
@@ -154,24 +153,6 @@ rb_encoder_interface_init (RBEncoderIface *iface)
rb_marshal_VOID__UINT64_STRING_POINTER,
G_TYPE_NONE,
3, G_TYPE_UINT64, G_TYPE_STRING, G_TYPE_POINTER);
- /**
- * RBEncoder::overwrite:
- * @encoder: the #RBEncoder instance
- * @file: the #GFile that may be overwritten
- *
- * Emitted when a destination file already exists. If the
- * return value if %TRUE, the file will be overwritten, otherwise
- * the transfer will be aborted.
- */
- signals[OVERWRITE] =
- g_signal_new ("overwrite",
- G_TYPE_FROM_INTERFACE (iface),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (RBEncoderIface, overwrite),
- NULL, NULL, /* need an accumulator here? */
- rb_marshal_BOOLEAN__OBJECT,
- G_TYPE_BOOLEAN,
- 1, G_TYPE_OBJECT);
}
GType
@@ -221,6 +202,7 @@ rb_encoder_factory_get ()
* @encoder: the #RBEncoder
* @entry: the #RhythmDBEntry to transcode
* @dest: destination file URI
+ * @overwrite: if %TRUE, overwrite @dest if it already exists
* @profile: encoding profile to use, or NULL to just copy
*
* Initiates encoding, transcoding to the specified profile if specified.
@@ -232,11 +214,12 @@ void
rb_encoder_encode (RBEncoder *encoder,
RhythmDBEntry *entry,
const char *dest,
+ gboolean overwrite,
GstEncodingProfile *profile)
{
RBEncoderIface *iface = RB_ENCODER_GET_IFACE (encoder);
- iface->encode (encoder, entry, dest, profile);
+ iface->encode (encoder, entry, dest, overwrite, profile);
}
/**
@@ -302,14 +285,6 @@ _rb_encoder_emit_completed (RBEncoder *encoder, guint64 dest_size, const char *m
g_signal_emit (encoder, signals[COMPLETED], 0, dest_size, mediatype, error);
}
-gboolean
-_rb_encoder_emit_overwrite (RBEncoder *encoder, GFile *file)
-{
- gboolean ret = FALSE;
- g_signal_emit (encoder, signals[OVERWRITE], 0, file, &ret);
- return ret;
-}
-
void
_rb_encoder_emit_prepare_source (RBEncoder *encoder, const char *uri, GObject *source)
{
@@ -346,6 +321,7 @@ rb_encoder_error_get_type (void)
ENUM_ENTRY (RB_ENCODER_ERROR_FILE_ACCESS, "file-access-error"),
ENUM_ENTRY (RB_ENCODER_ERROR_OUT_OF_SPACE, "out-of-space"),
ENUM_ENTRY (RB_ENCODER_ERROR_DEST_READ_ONLY, "destination-read-only"),
+ ENUM_ENTRY (RB_ENCODER_ERROR_DEST_EXISTS, "destination-exists"),
{ 0, 0, 0 }
};
diff --git a/backends/rb-encoder.h b/backends/rb-encoder.h
index fa82dc0..9a77415 100644
--- a/backends/rb-encoder.h
+++ b/backends/rb-encoder.h
@@ -55,7 +55,8 @@ typedef enum
RB_ENCODER_ERROR_INTERNAL,
RB_ENCODER_ERROR_FILE_ACCESS,
RB_ENCODER_ERROR_OUT_OF_SPACE,
- RB_ENCODER_ERROR_DEST_READ_ONLY
+ RB_ENCODER_ERROR_DEST_READ_ONLY,
+ RB_ENCODER_ERROR_DEST_EXISTS
} RBEncoderError;
GType rb_encoder_error_get_type (void);
@@ -76,6 +77,7 @@ struct _RBEncoderIface
void (*encode) (RBEncoder *encoder,
RhythmDBEntry *entry,
const char *dest,
+ gboolean overwrite,
GstEncodingProfile *profile);
void (*cancel) (RBEncoder *encoder);
gboolean (*get_missing_plugins) (RBEncoder *encoder,
@@ -85,7 +87,6 @@ struct _RBEncoderIface
/* signals */
void (*progress) (RBEncoder *encoder, double fraction);
- gboolean (*overwrite) (RBEncoder *encoder, GFile *file);
void (*completed) (RBEncoder *encoder, guint64 dest_size, const char *mediatype, GError *error);
};
@@ -113,6 +114,7 @@ GType rb_encoder_get_type (void);
void rb_encoder_encode (RBEncoder *encoder,
RhythmDBEntry *entry,
const char *dest,
+ gboolean overwrite,
GstEncodingProfile *profile);
void rb_encoder_cancel (RBEncoder *encoder);
@@ -124,7 +126,6 @@ gboolean rb_encoder_get_missing_plugins (RBEncoder *encoder,
/* only to be used by subclasses */
void _rb_encoder_emit_progress (RBEncoder *encoder, double fraction);
void _rb_encoder_emit_completed (RBEncoder *encoder, guint64 dest_size, const char *mediatype, GError *error);
-gboolean _rb_encoder_emit_overwrite (RBEncoder *encoder, GFile *file);
void _rb_encoder_emit_prepare_source (RBEncoder *encoder, const char *uri, GObject *source);
void _rb_encoder_emit_prepare_sink (RBEncoder *encoder, const char *uri, GObject *sink);
diff --git a/shell/rb-track-transfer-batch.c b/shell/rb-track-transfer-batch.c
index e77ea7a..45fdc23 100644
--- a/shell/rb-track-transfer-batch.c
+++ b/shell/rb-track-transfer-batch.c
@@ -70,6 +70,8 @@ static void rb_track_transfer_batch_class_init (RBTrackTransferBatchClass *klass
static void rb_track_transfer_batch_init (RBTrackTransferBatch *batch);
static gboolean start_next (RBTrackTransferBatch *batch);
+static void start_encoding (RBTrackTransferBatch *batch, gboolean overwrite);
+static void track_transfer_completed (RBTrackTransferBatch *batch, guint64 dest_size, const char *mediatype, GError *error);
static guint signals[LAST_SIGNAL] = { 0 };
@@ -95,6 +97,7 @@ struct _RBTrackTransferBatchPrivate
char *current_dest_uri;
double current_fraction;
RBEncoder *current_encoder;
+ GstEncodingProfile *current_profile;
gboolean cancelled;
};
@@ -406,6 +409,24 @@ _rb_track_transfer_batch_cancel (RBTrackTransferBatch *batch)
/* anything else? */
}
+/**
+ * _rb_track_transfer_batch_continue:
+ * @batch: a #RBTrackTransferBatch
+ * @overwrite: if %TRUE, overwrite the current file, otherwise skip
+ *
+ * Continues a transfer that was suspended because the current
+ * destination URI exists. Only to be called by the #RBTrackTransferQueue.
+ */
+void
+_rb_track_transfer_batch_continue (RBTrackTransferBatch *batch, gboolean overwrite)
+{
+ if (overwrite) {
+ start_encoding (batch, TRUE);
+ } else {
+ track_transfer_completed (batch, 0, NULL, NULL);
+ }
+}
+
static void
emit_progress (RBTrackTransferBatch *batch)
{
@@ -434,26 +455,18 @@ encoder_progress_cb (RBEncoder *encoder, double fraction, RBTrackTransferBatch *
}
static void
-encoder_completed_cb (RBEncoder *encoder,
- guint64 dest_size,
- const char *mediatype,
- GError *error,
- RBTrackTransferBatch *batch)
+track_transfer_completed (RBTrackTransferBatch *batch,
+ guint64 dest_size,
+ const char *mediatype,
+ GError *error)
{
RhythmDBEntry *entry;
- if (error != NULL) {
- rb_debug ("encoder finished (error: %s)", error->message);
- } else {
- rb_debug ("encoder finished (size %" G_GUINT64_FORMAT ")", dest_size);
- }
-
- g_object_unref (batch->priv->current_encoder);
- batch->priv->current_encoder = NULL;
-
entry = batch->priv->current;
batch->priv->current = NULL;
+ batch->priv->current_profile = NULL;
+
/* update batch state to reflect that the track is done */
batch->priv->total_fraction += batch->priv->current_entry_fraction;
batch->priv->done_entries = g_list_append (batch->priv->done_entries, entry);
@@ -476,13 +489,28 @@ encoder_completed_cb (RBEncoder *encoder,
}
}
-static gboolean
-encoder_overwrite_cb (RBEncoder *encoder, GFile *file, RBTrackTransferBatch *batch)
+static void
+encoder_completed_cb (RBEncoder *encoder,
+ guint64 dest_size,
+ const char *mediatype,
+ GError *error,
+ RBTrackTransferBatch *batch)
{
- gboolean overwrite = FALSE;
- g_signal_emit (batch, signals[OVERWRITE_PROMPT], 0, file, &overwrite);
+ g_object_unref (batch->priv->current_encoder);
+ batch->priv->current_encoder = NULL;
+
+ if (error == NULL) {
+ rb_debug ("encoder finished (size %" G_GUINT64_FORMAT ")", dest_size);
+ } else if (g_error_matches (error, RB_ENCODER_ERROR, RB_ENCODER_ERROR_DEST_EXISTS)) {
+ rb_debug ("encoder stopped because destination %s already exists",
+ batch->priv->current_dest_uri);
+ g_signal_emit (batch, signals[OVERWRITE_PROMPT], 0, batch->priv->current_dest_uri);
+ return;
+ } else {
+ rb_debug ("encoder finished (error: %s)", error->message);
+ }
- return overwrite;
+ track_transfer_completed (batch, dest_size, mediatype, error);
}
static char *
@@ -506,6 +534,28 @@ get_extension_from_location (RhythmDBEntry *entry)
return extension;
}
+static void
+start_encoding (RBTrackTransferBatch *batch, gboolean overwrite)
+{
+ if (batch->priv->current_encoder != NULL) {
+ g_object_unref (batch->priv->current_encoder);
+ }
+ batch->priv->current_encoder = rb_encoder_new ();
+
+ g_signal_connect_object (batch->priv->current_encoder, "progress",
+ G_CALLBACK (encoder_progress_cb),
+ batch, 0);
+ g_signal_connect_object (batch->priv->current_encoder, "completed",
+ G_CALLBACK (encoder_completed_cb),
+ batch, 0);
+
+ rb_encoder_encode (batch->priv->current_encoder,
+ batch->priv->current,
+ batch->priv->current_dest_uri,
+ overwrite,
+ batch->priv->current_profile);
+}
+
static gboolean
start_next (RBTrackTransferBatch *batch)
{
@@ -522,17 +572,6 @@ start_next (RBTrackTransferBatch *batch)
}
batch->priv->current_fraction = 0.0;
- batch->priv->current_encoder = rb_encoder_new ();
-
- g_signal_connect_object (batch->priv->current_encoder, "progress",
- G_CALLBACK (encoder_progress_cb),
- batch, 0);
- g_signal_connect_object (batch->priv->current_encoder, "overwrite",
- G_CALLBACK (encoder_overwrite_cb),
- batch, 0);
- g_signal_connect_object (batch->priv->current_encoder, "completed",
- G_CALLBACK (encoder_completed_cb),
- batch, 0);
rb_debug ("%d entries remain in the batch", g_list_length (batch->priv->entries));
@@ -607,21 +646,15 @@ start_next (RBTrackTransferBatch *batch)
batch->priv->current = entry;
batch->priv->current_entry_fraction = fraction;
+ batch->priv->current_profile = profile;
break;
}
- if (batch->priv->current == NULL) {
- g_object_unref (batch->priv->current_encoder);
- batch->priv->current_encoder = NULL;
- } else {
+ if (batch->priv->current != NULL) {
g_signal_emit (batch, signals[TRACK_STARTED], 0,
batch->priv->current,
batch->priv->current_dest_uri);
-
- rb_encoder_encode (batch->priv->current_encoder,
- batch->priv->current,
- batch->priv->current_dest_uri,
- profile);
+ start_encoding (batch, FALSE);
}
return TRUE;
@@ -930,11 +963,12 @@ rb_track_transfer_batch_class_init (RBTrackTransferBatchClass *klass)
/**
* RBTrackTransferBatch::overwrite-prompt:
* @batch: the #RBTrackTransferBatch
- * @file: the #GFile that may be overwritten
+ * @uri: the destination URI that already exists
*
* Emitted when the destination URI for a transfer already exists.
- * If a handler returns TRUE, the file will be overwritten, otherwise
- * the transfer will be skipped.
+ * The handler must call _rb_track_transfer_batch_continue or
+ * _rb_track_transfer_batch_cancel when it has figured out what to
+ * do.
*/
signals [OVERWRITE_PROMPT] =
g_signal_new ("overwrite-prompt",
@@ -942,9 +976,9 @@ rb_track_transfer_batch_class_init (RBTrackTransferBatchClass *klass)
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (RBTrackTransferBatchClass, overwrite_prompt),
NULL, NULL,
- rb_marshal_BOOLEAN__OBJECT,
- G_TYPE_BOOLEAN,
- 1, G_TYPE_FILE);
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE,
+ 1, G_TYPE_STRING);
/**
* RBTrackTransferBatch::track-started:
diff --git a/shell/rb-track-transfer-batch.h b/shell/rb-track-transfer-batch.h
index 8cc7d75..f748e94 100644
--- a/shell/rb-track-transfer-batch.h
+++ b/shell/rb-track-transfer-batch.h
@@ -101,6 +101,9 @@ void _rb_track_transfer_batch_start (RBTrackTransferBatch *batch,
GObject *queue); /* eh */
void _rb_track_transfer_batch_cancel (RBTrackTransferBatch *batch);
+void _rb_track_transfer_batch_continue (RBTrackTransferBatch *batch,
+ gboolean overwrite);
+
G_END_DECLS
#endif /* __RB_TRACK_TRANSFER_BATCH_H */
diff --git a/shell/rb-track-transfer-queue.c b/shell/rb-track-transfer-queue.c
index 0f63a7b..91d5dac 100644
--- a/shell/rb-track-transfer-queue.c
+++ b/shell/rb-track-transfer-queue.c
@@ -100,22 +100,63 @@ rb_track_transfer_queue_new (RBShell *shell)
return g_object_new (RB_TYPE_TRACK_TRANSFER_QUEUE, "shell", shell, NULL);
}
-static gboolean
-overwrite_prompt (RBTrackTransferBatch *batch, GFile *file, RBTrackTransferQueue *queue)
+static void
+overwrite_response_cb (GtkDialog *dialog, int response, RBTrackTransferQueue *queue)
+{
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+
+ switch (response) {
+ case GTK_RESPONSE_YES:
+ rb_debug ("replacing existing file");
+ _rb_track_transfer_batch_continue (queue->priv->current, TRUE);
+ break;
+
+ case GTK_RESPONSE_NO:
+ rb_debug ("skipping existing file");
+ _rb_track_transfer_batch_continue (queue->priv->current, FALSE);
+ break;
+
+ case GTK_RESPONSE_REJECT:
+ rb_debug ("skipping all existing files");
+ queue->priv->overwrite_decision = OVERWRITE_NONE;
+ _rb_track_transfer_batch_continue (queue->priv->current, FALSE);
+ break;
+
+ case GTK_RESPONSE_ACCEPT:
+ rb_debug ("replacing all existing files");
+ queue->priv->overwrite_decision = OVERWRITE_ALL;
+ _rb_track_transfer_batch_continue (queue->priv->current, TRUE);
+ break;
+
+ case GTK_RESPONSE_CANCEL:
+ case GTK_RESPONSE_DELETE_EVENT: /* not sure what the user really wants here */
+ rb_debug ("cancelling batch");
+ rb_track_transfer_queue_cancel_batch (queue, queue->priv->current);
+ break;
+
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+}
+
+static void
+overwrite_prompt (RBTrackTransferBatch *batch, const char *uri, RBTrackTransferQueue *queue)
{
switch (queue->priv->overwrite_decision) {
case OVERWRITE_PROMPT:
{
GtkWindow *window;
GtkWidget *dialog;
+ GFile *file;
GFileInfo *info;
- gint response;
char *text;
char *free_name;
const char *display_name;
free_name = NULL;
display_name = NULL;
+ file = g_file_new_for_uri (uri);
info = g_file_query_info (file,
G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME,
G_FILE_QUERY_INFO_NONE,
@@ -151,47 +192,25 @@ overwrite_prompt (RBTrackTransferBatch *batch, GFile *file, RBTrackTransferQueue
_("Replace _All"), GTK_RESPONSE_ACCEPT,
NULL);
+ g_signal_connect (dialog, "response", G_CALLBACK (overwrite_response_cb), queue);
gtk_widget_show (GTK_WIDGET (dialog));
- response = gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
g_free (free_name);
if (info != NULL) {
g_object_unref (info);
}
-
- switch (response) {
- case GTK_RESPONSE_YES:
- rb_debug ("replacing existing file");
- return TRUE;
-
- case GTK_RESPONSE_NO:
- rb_debug ("skipping existing file");
- return FALSE;
-
- case GTK_RESPONSE_REJECT:
- rb_debug ("skipping all existing files");
- queue->priv->overwrite_decision = OVERWRITE_NONE;
- return FALSE;
-
- case GTK_RESPONSE_ACCEPT:
- rb_debug ("replacing all existing files");
- queue->priv->overwrite_decision = OVERWRITE_ALL;
- return TRUE;
-
- case GTK_RESPONSE_CANCEL:
- rb_debug ("cancelling batch");
- rb_track_transfer_queue_cancel_batch (queue, batch);
- return FALSE;
- }
+ g_object_unref (file);
+ break;
}
case OVERWRITE_ALL:
rb_debug ("already decided to replace all existing files");
- return TRUE;
+ _rb_track_transfer_batch_continue (batch, TRUE);
+ break;
case OVERWRITE_NONE:
rb_debug ("already decided to skip all existing files");
- return FALSE;
+ _rb_track_transfer_batch_continue (batch, FALSE);
+ break;
default:
g_assert_not_reached ();
diff --git a/sources/rb-library-source.c b/sources/rb-library-source.c
index d9b2014..b66610a 100644
--- a/sources/rb-library-source.c
+++ b/sources/rb-library-source.c
@@ -1276,7 +1276,7 @@ track_done_cb (RBTrackTransferBatch *batch,
} else {
rb_error_dialog (NULL, _("Error transferring track"), "%s", error->message);
}
- } else {
+ } else if (dest != NULL) {
/* could probably do something smarter here to avoid
* re-reading tags etc.
*/
diff --git a/sources/rb-transfer-target.c b/sources/rb-transfer-target.c
index 478127d..985312e 100644
--- a/sources/rb-transfer-target.c
+++ b/sources/rb-transfer-target.c
@@ -360,15 +360,15 @@ track_done_cb (RBTrackTransferBatch *batch,
GError *error,
RBTransferTarget *target)
{
- if (error == NULL) {
- rb_transfer_target_track_added (target, entry, dest, dest_size, dest_mediatype);
- } else {
+ if (error != NULL) {
if (g_error_matches (error, RB_ENCODER_ERROR, RB_ENCODER_ERROR_OUT_OF_SPACE) ||
g_error_matches (error, RB_ENCODER_ERROR, RB_ENCODER_ERROR_DEST_READ_ONLY)) {
rb_debug ("fatal transfer error: %s", error->message);
rb_track_transfer_batch_cancel (batch);
}
rb_transfer_target_track_add_error (target, entry, dest, error);
+ } else if (dest_size != 0) {
+ rb_transfer_target_track_added (target, entry, dest, dest_size, dest_mediatype);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]