Update of /cvsroot/gtkpod/gtkpod/src
In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv13570/src
Modified Files:
Tag: threaded_conversion_branch
file_itunesdb.c prefs.c
Log Message:
* gtkpod.glade
src/file_itunesdb.c
src/prefs.c: unified progress dialog across
delete/transfer/writing iTunesDB for better user experience.
Index: file_itunesdb.c
===================================================================
RCS file: /cvsroot/gtkpod/gtkpod/src/file_itunesdb.c,v
retrieving revision 1.117.2.2
retrieving revision 1.117.2.3
diff -u -d -r1.117.2.2 -r1.117.2.3
--- file_itunesdb.c 20 Apr 2007 17:08:36 -0000 1.117.2.2
+++ file_itunesdb.c 21 Apr 2007 05:20:24 -0000 1.117.2.3
@@ -31,8 +31,7 @@
#endif
#include <string.h>
-#include <stdlib.h>
-#include <signal.h>
+#include <glib/gstdio.h>
#include "charset.h"
#include "display.h"
#include "file.h"
@@ -82,19 +81,19 @@
};
typedef struct {
- GMutex *mutex; /* lock when modifying struct! */
- gboolean abort; /* TRUE = abort */
- Track *track; /* Current track */
- const gchar *filename; /* Filename to copy */
+ GMutex *mutex; /* mutex for this struct */
+ gboolean abort; /* TRUE = abort */
+ GCond *finished_cond; /* used to signal end of thread */
+ gboolean finished; /* background thread has finished */
+ Track *track; /* Current track */
+ const gchar *filename; /* Filename to copy/remove */
+ /* Widgets for progress dialog */
+ GtkWidget *textlabel;
+ GtkWidget *progressbar;
} TransferData;
-/* Thread specific */
-static GMutex *mutex = NULL;
-static GCond *cond = NULL;
-static gboolean mutex_data = FALSE;
-/* Used to keep the "extended information" until the iTunesDB is
- loaded */
+/* Used to keep the "extended information" until the iTunesDB is loaded */
static GHashTable *extendedinfohash = NULL;
static GHashTable *extendedinfohash_sha1 = NULL;
static GList *extendeddeletion = NULL;
@@ -1281,27 +1280,32 @@
TransferData *transfer_data;
transfer_data = g_new0 (TransferData, 1);
transfer_data->mutex = g_mutex_new ();
+ transfer_data->finished_cond = g_cond_new ();
return transfer_data;
}
void transfer_data_free (TransferData *transfer_data)
{
- if (transfer_data->mutex) g_mutex_free (transfer_data->mutex);
+ if (transfer_data->mutex)
+ g_mutex_free (transfer_data->mutex);
+ if (transfer_data->finished_cond)
+ g_cond_free (transfer_data->finished_cond);
g_free (transfer_data);
}
/* Threaded remove file */
/* returns: int result (of remove()) */
-static gpointer th_remove (gpointer filename)
+static gpointer th_remove (gpointer userdata)
{
- guint result;
+ TransferData *td = userdata;
+ gint result;
- result = remove ((gchar *)filename);
- g_mutex_lock (mutex);
- mutex_data = TRUE; /* signal that thread will end */
- g_cond_signal (cond);
- g_mutex_unlock (mutex);
- return GUINT_TO_POINTER(result);
+ result = g_remove (td->filename);
+ g_mutex_lock (td->mutex);
+ td->finished = TRUE; /* signal that thread will end */
+ g_cond_signal (td->finished_cond);
+ g_mutex_unlock (td->mutex);
+ return GINT_TO_POINTER(result);
}
/* Threaded copy of ipod track */
@@ -1320,15 +1324,15 @@
/* delete old size */
if (td->track->transferred) etr->oldsize = 0;
- g_mutex_lock (mutex);
- mutex_data = TRUE; /* signal that thread will end */
- g_cond_signal (cond);
- g_mutex_unlock (mutex);
+ g_mutex_lock (td->mutex);
+ td->finished = TRUE; /* signal that thread will end */
+ g_cond_signal (td->finished_cond);
+ g_mutex_unlock (td->mutex);
return error;
}
/* This function is called when the user presses the abort button
- * during flush_tracks() */
+ * during transfer_tracks() */
static void file_dialog_abort (TransferData *transfer_data)
{
g_return_if_fail (transfer_data);
@@ -1367,23 +1371,10 @@
return result;
}
-static void file_dialog_expander_notify (GtkExpander *expander, GParamSpec
*param_spec, gpointer user_data)
-{
- gboolean expanded;
-
- /* Save the state of the expander to preferences */
- expanded = gtk_expander_get_expanded (expander);
- prefs_set_int("file_dialog_details_expanded", expanded);
-}
-
-static GtkWidget *create_file_dialog (GtkWidget **progress_bar,
- GtkWidget **text_label,
- GtkWidget **text_view,
- TransferData *transfer_data)
+static GtkWidget *create_transfer_information_dialog (TransferData *td)
{
GladeXML *dialog_xml;
GtkWidget *dialog, *widget;
- gint defx, defy;
dialog_xml = glade_xml_new (xml_file, "file_transfer_information_dialog",
NULL);
glade_xml_signal_autoconnect (dialog_xml);
@@ -1391,63 +1382,23 @@
dialog = gtkpod_xml_get_widget (dialog_xml,
"file_transfer_information_dialog");
g_return_val_if_fail (dialog, NULL);
- /* show/hide progress bar */
- widget = gtkpod_xml_get_widget (dialog_xml, "progressbar");
- if (progress_bar)
- {
- *progress_bar = widget;
- }
- else
- {
- gtk_widget_hide (widget);
- }
-
- /* show/hide text label */
- widget = gtkpod_xml_get_widget (dialog_xml, "textlabel");
- if (text_label)
- {
- *text_label = widget;
- }
- else
- {
- gtk_widget_hide (widget);
- }
-
- /* show/hide details */
- widget = gtkpod_xml_get_widget (dialog_xml, "details");
- if (text_view)
- {
- *text_view = gtkpod_xml_get_widget (dialog_xml, "textview");
- gtk_expander_set_expanded (GTK_EXPANDER (widget),
- prefs_get_int
("file_dialog_details_expanded"));
- g_signal_connect (GTK_OBJECT (widget), "notify::expanded",
- G_CALLBACK (file_dialog_expander_notify),
- NULL);
- defx = prefs_get_int ("size_file_dialog_details.x");
- defy = prefs_get_int ("size_file_dialog_details.y");
- }
- else
- {
- gtk_widget_hide (widget);
- defx = prefs_get_int ("size_file_dialog.x");
- defy = prefs_get_int ("size_file_dialog.y");
- }
+ /* text label */
+ td->textlabel = gtkpod_xml_get_widget (dialog_xml, "textlabel");
- gtk_window_set_default_size(GTK_WINDOW (dialog), defx, defy);
+ /* progress bar */
+ td->progressbar = gtkpod_xml_get_widget (dialog_xml, "progressbar");
/* Indicate that user wants to abort */
widget = gtkpod_xml_get_widget (dialog_xml, "abortbutton");
g_signal_connect_swapped (GTK_OBJECT (widget), "clicked",
G_CALLBACK (file_dialog_abort),
- transfer_data);
-
- gtk_widget_show (dialog);
+ td);
return dialog;
}
-static gchar *flush_tracks_get_progtext (time_t start, gint n, gint count)
+static gchar *get_progresstext (time_t start, gint n, gint count)
{
gchar *progtext;
@@ -1479,20 +1430,16 @@
the local harddisk (for itdb->usertype == GP_ITDB_TYPE_LOCAL) */
/* Returns TRUE on success, FALSE if some error occurred and not all
files were removed */
-static gboolean delete_files (iTunesDB *itdb)
+static gboolean delete_files (iTunesDB *itdb, TransferData *td)
{
- GtkWidget *dialog, *progress_bar, *textlabel;
gchar *progtext = NULL;
gboolean result = TRUE;
gint n, count;
- gint w, h;
time_t start;
- TransferData *transfer_data;
ExtraiTunesDBData *eitdb;
GThread *thread = NULL;
- GTimeVal gtime;
- if (!mutex) mutex = g_mutex_new ();
- if (!cond) cond = g_cond_new ();
+
+ g_return_val_if_fail (td, FALSE);
g_return_val_if_fail (itdb, FALSE);
eitdb = itdb->userdata;
@@ -1508,18 +1455,14 @@
g_return_val_if_fail (itdb_get_mountpoint (itdb), FALSE);
}
- transfer_data = transfer_data_new ();
-
- dialog = create_file_dialog (&progress_bar, &textlabel, NULL, transfer_data);
-
- gtk_label_set_text (GTK_LABEL (textlabel), _("Status: Deleting File"));
+ gtk_label_set_text (GTK_LABEL (td->textlabel), _("Status: Deleting File"));
n = g_list_length (eitdb->pending_deletion);
count = 0; /* number of tracks removed */
start = time (NULL); /* start time for progress bar */
/* lets clean up those pending deletions */
- while (!transfer_data->abort && eitdb->pending_deletion)
+ while (!td->abort && eitdb->pending_deletion)
{
gchar *filename = NULL;
Track *track = eitdb->pending_deletion->data;
@@ -1538,44 +1481,48 @@
if(filename)
{
- guint rmres;
+ gint rmres;
- gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR (progress_bar),
+ gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR (td->progressbar),
(gdouble) count/n);
- progtext = flush_tracks_get_progtext (start, n, count);
+ td->finished = FALSE;
+ td->filename = filename;
- gtk_progress_bar_set_text(GTK_PROGRESS_BAR (progress_bar),
- progtext);
- g_free (progtext);
+ thread = g_thread_create (th_remove, td, TRUE, NULL);
+ g_mutex_lock (td->mutex);
+ do
+ {
+ GTimeVal gtime;
- mutex_data = FALSE;
- thread = g_thread_create (th_remove, filename, TRUE, NULL);
- if (thread)
+ progtext = get_progresstext (start, n, count);
+ gtk_progress_bar_set_text(GTK_PROGRESS_BAR (td->progressbar),
progtext);
+ g_free (progtext);
+
+ while (widgets_blocked && gtk_events_pending ())
+ gtk_main_iteration ();
+
+ /* wait a maximum of 20 ms or until cond is signaled */
+ g_get_current_time (>ime);
+ g_time_val_add (>ime, 20000);
+ g_cond_timed_wait (td->finished_cond,
+ td->mutex, >ime);
+ } while(!td->finished);
+
+ g_mutex_unlock (td->mutex);
+
+ rmres = GPOINTER_TO_INT(g_thread_join (thread));
+
+ if (rmres == -1)
{
- g_mutex_lock (mutex);
- do
- {
- while (widgets_blocked && gtk_events_pending ())
- gtk_main_iteration ();
- /* wait a maximum of 20 ms */
- g_get_current_time (>ime);
- g_time_val_add (>ime, 20000);
- g_cond_timed_wait (cond, mutex, >ime);
- /* Waits until this thread is woken up on cond, but
- not longer than until the time specified by
- abs_time. The mutex is unlocked before falling
- asleep and locked again before resuming. */
- } while(!mutex_data);
- g_mutex_unlock (mutex);
- rmres = GPOINTER_TO_UINT(g_thread_join (thread));
- if (rmres == -1) result = FALSE;
- }
- else {
- g_warning ("Thread creation failed, falling back to default.\n");
- remove (filename);
+ gtkpod_warning (_("Could not remove the following file:
'%s'\n\n"),
+ filename);
+
+ while (widgets_blocked && gtk_events_pending ())
+ gtk_main_iteration ();
}
- g_free(filename);
+
+ g_free (filename);
}
++count;
itdb_track_free (track);
@@ -1586,14 +1533,8 @@
while (widgets_blocked && gtk_events_pending ())
gtk_main_iteration ();
- /* Save size of file dialog */
- gtk_window_get_size (GTK_WINDOW(dialog), &w, &h);
- prefs_set_int("size_file_dialog.x", w);
- prefs_set_int("size_file_dialog.y", h);
+ if (td->abort) result = FALSE;
- gtk_widget_destroy (dialog);
- if (transfer_data->abort) result = FALSE;
- transfer_data_free (transfer_data);
return result;
}
@@ -1605,21 +1546,15 @@
/* Flushes all non-transferred tracks to the iPod filesystem
Returns TRUE on success, FALSE if some error occurred or not all
tracks were written. */
-static gboolean flush_tracks (iTunesDB *itdb)
+static gboolean transfer_tracks (iTunesDB *itdb, TransferData *td)
{
GList *gl;
- gint count, n, w, h, trackserrnum, tracksleftnum;
+ gint count, n, trackserrnum, tracksleftnum;
gboolean result = TRUE;
- TransferData *transfer_data;
- GtkWidget *dialog, *progress_bar, *textlabel;
time_t start;
gchar *progtext = NULL;
ExtraiTunesDBData *eitdb;
GThread *thread = NULL;
- GTimeVal gtime;
-
- if (!mutex) mutex = g_mutex_new ();
- if (!cond) cond = g_cond_new ();
g_return_val_if_fail (itdb, FALSE);
eitdb = itdb->userdata;
@@ -1629,26 +1564,14 @@
if (n == 0) return TRUE;
- transfer_data = transfer_data_new ();
-
- /* create the dialog window */
- dialog = create_file_dialog (&progress_bar,
- &textlabel,
- NULL,
- transfer_data);
-
- transfer_data->abort = FALSE;
-
/* count number of tracks to be transferred */
count = 0; /* tracks transferred */
start = time (NULL);
- gtkpod_statusbar_timeout (3*STATUSBAR_TIMEOUT);
-
do
{
trackserrnum = 0;
- for (gl=itdb->tracks; gl && !transfer_data->abort; gl=gl->next)
+ for (gl=itdb->tracks; gl && !td->abort; gl=gl->next)
{
const gchar *file_to_transfer = NULL;
Track *track = gl->data;
@@ -1715,47 +1638,44 @@
if (file_to_transfer)
{
- transfer_data->track = track;
- transfer_data->filename = file_to_transfer;
+ td->finished = FALSE;
+ td->track = track;
+ td->filename = file_to_transfer;
- gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR (progress_bar),
+ gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR
(td->progressbar),
(gdouble) count/n);
- progtext = flush_tracks_get_progtext (start, n, count);
-
- gtk_progress_bar_set_text(GTK_PROGRESS_BAR (progress_bar),
- progtext);
- g_free (progtext);
-
- gtk_label_set_text (GTK_LABEL(textlabel),
+ gtk_label_set_text (GTK_LABEL(td->textlabel),
_("Status: Copying track"));
- while (widgets_blocked && gtk_events_pending ())
- gtk_main_iteration ();
+ thread = g_thread_create (th_copy, td, TRUE, NULL);
- thread = g_thread_create (th_copy, transfer_data, TRUE, NULL);
- if (thread)
+ g_mutex_lock (td->mutex);
+ do
{
- g_mutex_lock (mutex);
- do
- {
- /* wait a maximum of 20 ms */
- g_get_current_time (>ime);
- g_time_val_add (>ime, 20*1000);
- g_cond_timed_wait (cond, mutex, >ime);
- while (widgets_blocked && gtk_events_pending ())
- gtk_main_iteration ();
- } while(!mutex_data);
- g_mutex_unlock (mutex);
- error = g_thread_join (thread);
- }
- else {
- g_warning ("Thread creation failed, falling back to
default.\n");
- error = th_copy (transfer_data);
- }
+ GTimeVal gtime;
+
+ progtext = get_progresstext (start, n, count);
+ gtk_progress_bar_set_text(
+ GTK_PROGRESS_BAR (td->progressbar), progtext);
+ g_free (progtext);
+
+ while (widgets_blocked && gtk_events_pending ())
+ gtk_main_iteration ();
+
+ /* wait a maximum of 20 ms */
+ g_get_current_time (>ime);
+ g_time_val_add (>ime, 20*1000);
+ g_cond_timed_wait (td->finished_cond,
+ td->mutex, >ime);
+
+ } while(td->finished);
+ g_mutex_unlock (td->mutex);
+ error = g_thread_join (thread);
+
if (error)
{ /* an error occurred */
- if(!transfer_data->abort) {
+ if(!td->abort) {
result = FALSE;
if (error->message)
gtkpod_warning ("%s\n\n", error->message);
@@ -1763,24 +1683,19 @@
g_warning ("error->message == NULL!\n");
}
g_error_free (error);
+ ++trackserrnum;
}
+
data_changed (itdb); /* otherwise new free space status from
iPod is never read and free space
keeps increasing while we copy more
and more files to the iPod */
++count;
-
- gtkpod_statusbar_message (
- ngettext ("Copied %d of %d new track.",
- "Copied %d of %d new tracks.", n),
- count, n);
- while (widgets_blocked && gtk_events_pending ())
- gtk_main_iteration ();
}
}
} /* for (gl=itdb->tracks;.;.) */
- gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR (progress_bar),
+ gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR (td->progressbar),
(gdouble) count/n);
tracksleftnum = itdb_tracks_number_nontransferred (itdb);
@@ -1788,38 +1703,28 @@
{ /* waiting for files to finish conversion */
do
{
- progtext = flush_tracks_get_progtext (start, n, count);
- gtk_progress_bar_set_text(GTK_PROGRESS_BAR (progress_bar),
progtext);
+ progtext = get_progresstext (start, n, count);
+ gtk_progress_bar_set_text(GTK_PROGRESS_BAR (td->progressbar),
progtext);
g_free (progtext);
- gtk_label_set_text (GTK_LABEL(textlabel),
+ gtk_label_set_text (GTK_LABEL(td->textlabel),
_("Status: Waiting for conversion to
complete"));
while (widgets_blocked && gtk_events_pending ())
gtk_main_iteration ();
- } while (!transfer_data->abort &&
+ } while (!td->abort &&
!file_convert_timed_wait (itdb, 20));
}
- } while (!transfer_data->abort &&
+ } while (!td->abort &&
(itdb_tracks_number_nontransferred (itdb) > trackserrnum));
- gtkpod_statusbar_timeout (0);
- if (transfer_data->abort) result = FALSE; /* negative result if user
aborted */
+ if (td->abort) result = FALSE; /* negative result if user aborted */
+
if (result == FALSE)
gtkpod_statusbar_message (_("Some tracks were not written to iPod.
Export aborted!"));
- gtkpod_statusbar_timeout (0);
- /* Save size of file dialog */
- gtk_window_get_size (GTK_WINDOW(dialog), &w, &h);
- prefs_set_int("size_file_dialog_details.x", w);
- prefs_set_int("size_file_dialog_details.y", h);
-
- gtk_widget_destroy (dialog);
- while (widgets_blocked && gtk_events_pending ()) gtk_main_iteration ();
-
- g_free (transfer_data);
return result;
}
@@ -1829,6 +1734,8 @@
gchar *cfgdir;
gboolean success = TRUE;
ExtraiTunesDBData *eitdb;
+ GtkWidget *dialog;
+ TransferData *transferdata;
g_return_val_if_fail (itdb, FALSE);
eitdb = itdb->userdata;
@@ -1885,7 +1792,11 @@
}
}
- block_widgets (); /* block user input */
+ block_widgets ();
+
+ transferdata = transfer_data_new ();
+ dialog = create_transfer_information_dialog (transferdata);
+ gtk_widget_show (dialog);
if((itdb->usertype & GP_ITDB_TYPE_IPOD) && !get_offline (itdb))
{
@@ -1904,7 +1815,7 @@
}
if (success)
{ /* remove deleted files */
- success = delete_files (itdb);
+ success = delete_files (itdb, transferdata);
if (!success)
{
gtkpod_statusbar_message (_("Some tracks could not be deleted
from the iPod. Export aborted!"));
@@ -1913,20 +1824,23 @@
if (success)
{
/* write tracks to iPod */
- success = flush_tracks (itdb);
+ success = transfer_tracks (itdb, transferdata);
}
}
if (itdb->usertype & GP_ITDB_TYPE_LOCAL)
{
- success = delete_files (itdb);
+ success = delete_files (itdb, transferdata);
}
if (success)
- gtkpod_statusbar_message (_("Now writing database. Please wait..."));
- while (widgets_blocked && gtk_events_pending ())
- gtk_main_iteration ();
+ {
+ gtk_label_set_text (GTK_LABEL (transferdata->textlabel),
+ _("Now writing database. Please wait..."));
+ while (widgets_blocked && gtk_events_pending ())
+ gtk_main_iteration ();
+ }
if (success && !get_offline (itdb) &&
(itdb->usertype & GP_ITDB_TYPE_IPOD))
@@ -2065,7 +1979,10 @@
g_free (cfgdir);
- release_widgets (); /* Allow input again */
+ gtk_widget_destroy (dialog);
+ transfer_data_free (transferdata);
+
+ release_widgets ();
return success;
}
Index: prefs.c
===================================================================
RCS file: /cvsroot/gtkpod/gtkpod/src/prefs.c,v
retrieving revision 1.283
retrieving revision 1.283.2.1
diff -u -d -r1.283 -r1.283.2.1
--- prefs.c 15 Apr 2007 11:31:39 -0000 1.283
+++ prefs.c 21 Apr 2007 05:20:24 -0000 1.283.2.1
@@ -931,6 +931,10 @@
prefs_set_string("display_artcovers", NULL);
prefs_set_string("block_display", NULL);
prefs_set_string("tmp_disable_sort", NULL);
+ prefs_set_string("size_file_dialog.x", NULL);
+ prefs_set_string("size_file_dialog.y", NULL);
+ prefs_set_string("size_file_dialog_details.x", NULL);
+ prefs_set_string("size_file_dialog_details.y", NULL);
/* sp_created_cond renamed to sp_added_cond */
for (i = 0; i < SORT_TAB_MAX; i++)
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
gtkpod-cvs2 mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2