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 (&gtime);
+             g_time_val_add (&gtime, 20000);
+             g_cond_timed_wait (td->finished_cond,
+                                td->mutex, &gtime);
+         } 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 (&gtime);
-                 g_time_val_add (&gtime, 20000);
-                 g_cond_timed_wait (cond, mutex, &gtime);
-                  /* 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 (&gtime);
-                         g_time_val_add (&gtime, 20*1000);
-                         g_cond_timed_wait (cond, mutex, &gtime);
-                         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 (&gtime);
+                     g_time_val_add (&gtime, 20*1000);
+                     g_cond_timed_wait (td->finished_cond,
+                                        td->mutex, &gtime);
+
+                 } 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

Reply via email to