Update of /cvsroot/gtkpod/gtkpod/src
In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv1398/src

Modified Files:
        Makefile.am display_itdb.h file.h file_convert.c 
        file_convert.h file_itunesdb.c prefs.c prefs_window.c 
Log Message:
        * src/details.c
          gtkpod.glade: small fixes for "Edit Details Window" by Mario Rossi.

        * gtkpod.glade
          scripts/convert-flac2m4a.sh
          scripts/convert-flac2mp3.sh
          scripts/convert-ogg2m4a.sh
          scripts/convert-ogg2mp3.sh
          scripts/Makefile.am
          src/display_itdb.h
          src/file.h
          src/file_convert.c
          src/file_convert.h
          src/file_itunesdb.c
          src/prefs_window.c
          src/prefs.c: display of conversion progress and improved
          conversion scripts (receive meta tags by command line
          arguments). Thanks to Simon Naunton!

          scripts/convert-m4a2mp3.sh
          scripts/convert-mp32m4a.sh
          scripts/convert-wav2m4a.sh
          scripts/convert-wav2mp3.sh: new scripts for mp3, m4a and wav
          conversion.



Index: Makefile.am
===================================================================
RCS file: /cvsroot/gtkpod/gtkpod/src/Makefile.am,v
retrieving revision 1.60
retrieving revision 1.61
diff -u -d -r1.60 -r1.61
--- Makefile.am 16 Jan 2007 09:44:59 -0000      1.60
+++ Makefile.am 5 Feb 2007 08:45:56 -0000       1.61
@@ -38,8 +38,10 @@
     display_itdb.c display_itdb.h \
     display_spl.c display_tracks.c \
     file.c file.h file_export.c \
+    file_convert.c file_convert.h \
     file_itunesdb.c \
     fileselection.h fileselection.c \
+    flacfile.c flacfile.h \
     info.c info.h \
     ipod_init.c ipod_init.h \
     itdb.h \
@@ -52,6 +54,7 @@
     misc_track.c misc_track.h \
     mp3file.c mp3file.h \
     mp4file.c mp4file.h \
+    oggfile.c oggfile.h \
     podcast.c podcast.h \
     prefs.c prefs.h \
     prefs_window.c prefs_window.h \
@@ -59,10 +62,7 @@
     sha1.c sha1.h \
     syncdir.c syncdir.h \
     tools.c tools.h \
-    wavfile.c wavfile.h \
-    oggfile.c oggfile.h \
-    flacfile.c flacfile.h \
-    file_convert.c file_convert.h
+    wavfile.c wavfile.h
 
 gtkpod_LDADD = @PACKAGE_LIBS@ $(INTLLIBS) @LIBOBJS@
 

Index: display_itdb.h
===================================================================
RCS file: /cvsroot/gtkpod/gtkpod/src/display_itdb.h,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -d -r1.38 -r1.39
--- display_itdb.h      18 Jan 2007 16:16:43 -0000      1.38
+++ display_itdb.h      5 Feb 2007 08:45:56 -0000       1.39
@@ -1,4 +1,4 @@
-/* Time-stamp: <2007-01-19 00:55:02 jcs>
+/* Time-stamp: <2007-02-05 15:49:25 jcs>
 |
 |  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
 |  Part of the gtkpod project.
@@ -36,7 +36,7 @@
 
 #include <gtk/gtk.h>
 #include "itdb.h"
-#include "file.h"
+#include "file_convert.h"
 
 struct itdbs_head
 {

Index: file.h
===================================================================
RCS file: /cvsroot/gtkpod/gtkpod/src/file.h,v
retrieving revision 1.57
retrieving revision 1.58
diff -u -d -r1.57 -r1.58
--- file.h      18 Jan 2007 16:16:43 -0000      1.57
+++ file.h      5 Feb 2007 08:45:56 -0000       1.58
@@ -1,4 +1,4 @@
-/* Time-stamp: <2007-01-19 00:59:21 jcs>
+/* Time-stamp: <2007-02-05 12:53:44 jcs>
 |
 |  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
 |  Part of the gtkpod project.
@@ -98,6 +98,8 @@
 gboolean gp_eject_ipod(iTunesDB *itdb);
 gboolean gp_save_itdb (iTunesDB *itdb);
 void handle_export (void);
+void details_log_clear (void);
+void details_log_append (gchar *text);
 void data_changed (iTunesDB *itdb);
 void data_unchanged (iTunesDB *itdb);
 gboolean files_are_saved (void);

Index: file_convert.c
===================================================================
RCS file: /cvsroot/gtkpod/gtkpod/src/file_convert.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- file_convert.c      18 Jan 2007 16:16:43 -0000      1.2
+++ file_convert.c      5 Feb 2007 08:46:00 -0000       1.3
@@ -70,26 +70,26 @@
  */
 extern GError *file_convert_pre_copy (TrackConv *converter)
 {   
-    ExtraTrackData *etr=NULL;
-    GError *error=NULL;                 /* error if any */
-    const gchar *type=NULL;             /* xxx (ogg) */
-    gchar *convert_command=NULL;        /* from prefs */
-    gchar **argv;                       /* for conversion external process */
+    Track *track = NULL;
+    ExtraTrackData *etr = NULL;
+    GError *error = NULL;                 /* error if any */
+    const gchar *type = NULL;             /* xxx (ogg) */
+    gchar *convert_command = NULL;        /* from prefs */
+    gchar **argv;                         /* for conversion external process */
+    gint i;
 
     /* sanity checks */
     g_return_val_if_fail (converter, NULL);
     g_return_val_if_fail (converter->track, NULL);
-    etr=converter->track->userdata;
+    track = converter->track;
+    etr = track->userdata;
     g_return_val_if_fail (etr, NULL);
 
     /* Find the correct script for conversion */
     switch (converter->type) {
         case FILE_TYPE_UNKNOWN:
-        case FILE_TYPE_MP3:
-        case FILE_TYPE_M4A:
         case FILE_TYPE_M4P:
         case FILE_TYPE_M4B:
-        case FILE_TYPE_WAV:
         case FILE_TYPE_M4V:
         case FILE_TYPE_MP4:
         case FILE_TYPE_MOV:
@@ -100,6 +100,15 @@
         case FILE_TYPE_DIRECTORY:
             return NULL; /*FIXME: error? */
             break;
+        case FILE_TYPE_M4A:
+            convert_command = prefs_get_string ("path_conv_m4a");
+            break;
+        case FILE_TYPE_WAV:
+            convert_command = prefs_get_string ("path_conv_wav");
+            break;
+        case FILE_TYPE_MP3:
+            convert_command = prefs_get_string ("path_conv_mp3");
+            break;
         case FILE_TYPE_OGG:
            convert_command = prefs_get_string ("path_conv_ogg");
             break;
@@ -118,15 +127,60 @@
                           type);
     }
     /* FIXME: check that %s is present (at least) */
-    
+   
     /* Build the command args */
-    argv = g_malloc0(sizeof(gchar*) * 3);
-    argv[0] = convert_command;
-    argv[1] = etr->pc_path_locale;
+    argv = g_malloc0(sizeof(gchar*) * 17);
 
-    /* Convert the file */
+    argv[0] = g_strdup (convert_command);
+    i = 1;
+    if (track->artist) {
+        argv[i] = g_strdup ("-a");
+        ++i;
+        argv[i] = g_strdup (track->artist);
+        ++i;
+    }
+    if (track->album) {
+        argv[i] = g_strdup ("-A");
+        ++i;
+        argv[i] = g_strdup (track->album);
+        ++i;
+    }
+    if (track->track_nr) {
+        argv[i] = g_strdup ("-T");
+        ++i;
+        argv[i] = g_strdup_printf("%d", track->track_nr);
+        ++i;
+    }
+    if (track->title) {
+        argv[i] = g_strdup ("-t");
+        ++i;
+        argv[i] = g_strdup (track->title);
+        ++i;
+    }
+    if (track->genre) {
+        argv[i] = g_strdup ("-g");
+        ++i;
+        argv[i] = g_strdup (track->genre);
+        ++i;
+    }
+    if (track->year) {
+        argv[i] = g_strdup ("-y");
+        ++i;
+        argv[i] = g_strdup_printf("%d", track->year);
+        ++i;
+    }
+    if (track->comment) {
+        argv[i] = g_strdup ("-c");
+        ++i;
+        argv[i] = g_strdup (track->comment);
+        ++i;
+    }
+    argv[i] = g_strdup (etr->pc_path_locale);
 
-    error=execute_conv (argv, converter); /* frees all cmdline strings */
+    argv = g_realloc(argv, (i + 1) * sizeof(gchar*));
+
+    /* Convert the file */
+    error = execute_conv (argv, converter); /* frees all cmdline strings */
 
     return error;
 }
@@ -145,6 +199,7 @@
     GPid wait;
     gchar *error_msg=NULL;
     GError *error=NULL;
+    gboolean aborted = FALSE;
 
     /* sanity checks */ 
     g_return_val_if_fail (converter, NULL);
@@ -174,8 +229,11 @@
             }
         }else if (WIFSIGNALED(exit_status)) {
             debug(":0x%X -> %d\n",exit_status,WTERMSIG(exit_status));
+            aborted = TRUE;
+/*
             error_msg = g_strdup_printf ("Execution failed. Received signal %d 
(%s)",
                                          
WTERMSIG(exit_status),(error?error->message:""));
+*/
         }else if (WIFSTOPPED(exit_status)) {
             debug(":0x%X -> %d\n",exit_status,WSTOPSIG(exit_status));
             error_msg = g_strdup_printf ("Execution stopped. Received signal 
%d (%s)",
@@ -192,24 +250,34 @@
     }
     debug("Error: %s\n",(error_msg?error_msg:"N/A"));
 
-    /* Getting filename from child's STDOUT */
-    if (!error_msg)
-        error_msg = get_filename_from_stdout (converter);
+    if(aborted) error = conv_error(_("Aborted.\n"));
+    else {
+        /* Getting filename from child's STDOUT */
+        if (!error_msg)
+            error_msg = get_filename_from_stdout (converter);
 
-    /* Checking file exists */
-    if (!error_msg)
-        error_msg = checking_converted_file (converter);
+        /* Checking file exists */
+        if (!error_msg)
+            error_msg = checking_converted_file (converter);
 
-    /* Checking errors */
-    if (error_msg){
-        error=conv_error(_("Cannot convert '%s'.\nExecuting `%s'\nGave error: 
%s\n\n"),
-                         etr->pc_path_locale,
-                         converter->command_line,
-                         error_msg);
-        g_free (error_msg);
+        /* Checking errors */
+        if (error_msg){
+            error=conv_error(_("Cannot convert '%s'.\nExecuting `%s'\nGave 
error: %s\n\n"),
+                             etr->pc_path_locale,
+                             converter->command_line,
+                             error_msg);
+            g_free (error_msg);
+        }
     }
+
     /* Freeing data */
     if (converter->child_pid) {
+        details_log_clear ();
+
+        if (!g_source_remove (converter->source_id)) {
+             error = conv_error(_("Failed to remove watch\n\n"));
+        }
+
         g_spawn_close_pid(converter->child_pid);
         converter->child_pid=0;
     }
@@ -263,9 +331,40 @@
  *
  */
 
+/*
+ * Called by watch on stderr to update details log
+ */
+static gboolean execute_conv_cb(GIOChannel *source, GIOCondition condition,  
TrackConv *converter)
+{
+    GIOStatus status;
+    gchar buf[255];
+    gsize bytes_read;
+
+    if (converter->aborted) return FALSE;
+
+    while (1) {
+      status = g_io_channel_read_chars (source, buf, sizeof(buf) - 1, 
&bytes_read, NULL);
+      buf[bytes_read] = '\0';
+      switch (status) {
+
+        case G_IO_STATUS_ERROR :
+          return FALSE;
+
+        case G_IO_STATUS_EOF :
+          details_log_append(buf);
+          return FALSE;
 
+        case G_IO_STATUS_NORMAL :
+          details_log_append(buf);
+          break;
 
+        case G_IO_STATUS_AGAIN :
+          return TRUE;
+      }
+    }
 
+    return FALSE; 
+}
 
 
 /*
@@ -273,13 +372,15 @@
  */
 static GError *execute_conv (gchar **argv, TrackConv *converter)
 {
-    ExtraTrackData *etr=NULL;
-    GError *error=NULL;
-    gchar *command_line=NULL;
-    GError *spawn_error=NULL;
-    guint i=0;
+    ExtraTrackData *etr = NULL;
+    GError *error = NULL;
+    gchar *command_line = NULL;
+    GError *spawn_error = NULL;
+    guint i = 0;
     GPid child_pid;
     gint child_stdout;
+    gint child_stderr;
+    GIOChannel *gio_channel;
 
     /* sanity checks */ 
     g_return_val_if_fail (converter, NULL);
@@ -290,13 +391,14 @@
     g_return_val_if_fail (argv, NULL);
 
     /* Building command_line string (for output only) */
-    for(i=0; argv[i]!=NULL; ++i) 
+    for (i = 0; argv[i] != NULL; ++i) 
     {
-        gchar *p=command_line;
+
+        gchar *p = command_line;
         if (!p) 
-            command_line=g_strdup(argv[i]);                      /* program 
name (1st token) */
+            command_line = g_strdup(argv[i]);                      /* program 
name (1st token) */
         else {
-            command_line=g_strdup_printf("%s \"%s\"",p,argv[i]); /* arg (other 
tokens) */
+            command_line = g_strdup_printf("%s \"%s\"",p,argv[i]); /* arg 
(other tokens) */
             g_free(p);
         }
     }
@@ -314,22 +416,33 @@
                                  &child_pid,                /* child's PID */
                                  NULL,                      /* child's stdin */
                                  &child_stdout,             /* child's stdout 
*/
-                                 NULL,                      /* child's stderr 
FIXME: get this for "debug"    (result?) */
-                                 &spawn_error)==FALSE){     /* error */
+                                 &child_stderr,             /* child's stderr 
FIXME: get this for "debug"    (result?) */
+                                 &spawn_error)==FALSE)
+    {     /* error */
         debug("error: error:%p (message:%s)",error, 
(error?error->message:"NoErrorMessage"));
         error = conv_error(_("Cannot convert '%s'.\nExecuting `%s'\nGave 
error: %s\n\n"),
-                             etr->pc_path_locale,
-                             command_line,
-                             
(spawn_error&&spawn_error->message)?spawn_error->message:"no explanation. 
Please report.");
+                          etr->pc_path_locale,
+                          command_line,
+                          
(spawn_error&&spawn_error->message)?spawn_error->message:"no explanation. 
Please report.");
         if (spawn_error)
-            g_free (spawn_error);   /* FIXME: memory leak i guess (at least 
for message if any). */
+       {
+            g_free (spawn_error);   /* FIXME: memory leak i guess (at
+                                    * least for message if any). */
+       }
         g_free (command_line);
-    } else {
-        converter->child_pid=child_pid;
-        converter->child_stdout=child_stdout;
-        converter->command_line=command_line;
     }
-
+    else
+    {
+        converter->child_pid = child_pid;
+        converter->child_stdout = child_stdout;
+        converter->command_line = command_line;
+        gio_channel = g_io_channel_unix_new (child_stderr);
+        g_io_channel_set_flags (gio_channel, G_IO_FLAG_NONBLOCK, NULL);
+        converter->source_id = g_io_add_watch (gio_channel, G_IO_IN, 
(GIOFunc)execute_conv_cb, converter);
+        g_io_channel_set_close_on_unref (gio_channel, TRUE);
+        g_io_channel_unref (gio_channel);
+        converter->aborted = FALSE;
+    }
     /* Freeing data */
     for(i=0; argv[i]!=NULL; ++i){
         g_free (argv[i]);

Index: file_convert.h
===================================================================
RCS file: /cvsroot/gtkpod/gtkpod/src/file_convert.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- file_convert.h      18 Jan 2007 16:16:43 -0000      1.2
+++ file_convert.h      5 Feb 2007 08:46:00 -0000       1.3
@@ -6,18 +6,21 @@
 #endif
 
 #include <gtk/gtk.h>
-#include "display_itdb.h"
+#include <itdb.h>
+#include <file.h>
 
 typedef struct
 {
-    Track   *track;                 /* Track to convert */
-    gchar   *converted_file;        /* PC filename of the "mp3" file 
-                                       != NULL if the file exists   */
-    gint32   old_size;              /* size of the original file    */
-    FileType type;                  /* type of the original file    */
-    GPid     child_pid;             /* PID of conversion process    */
-    gint     child_stdout;          /* STDOUT of conversion process */
-    gchar   *command_line;          /* used for conversion */
+    Track   *track;                /* Track to convert */
+    gchar   *converted_file;       /* PC filename of the "mp3" file 
+                                      != NULL if the file exists   */
+    gint32   old_size;             /* size of the original file    */
+    FileType type;                 /* type of the original file    */
+    GPid     child_pid;            /* PID of conversion process    */
+    gint     child_stdout;         /* STDOUT of conversion process */
+    gchar    *command_line;        /* used for conversion */
+    gint     source_id;
+    gboolean aborted;
 } TrackConv;
 
 

Index: file_itunesdb.c
===================================================================
RCS file: /cvsroot/gtkpod/gtkpod/src/file_itunesdb.c,v
retrieving revision 1.106
retrieving revision 1.107
diff -u -d -r1.106 -r1.107
--- file_itunesdb.c     18 Jan 2007 16:54:07 -0000      1.106
+++ file_itunesdb.c     5 Feb 2007 08:46:00 -0000       1.107
@@ -1,4 +1,4 @@
-/* Time-stamp: <2007-01-19 01:52:28 jcs>
+/* Time-stamp: <2007-02-05 17:27:00 jcs>
 |
 |  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
 |  Part of the gtkpod project.
@@ -33,6 +33,7 @@
 
 #include <string.h>
 #include <stdlib.h>
+#include <signal.h>
 #include "charset.h"
 #include "display.h"
 #include "file.h"
@@ -79,9 +80,17 @@
     gboolean transferred;
 };
 
+typedef struct {
+    GMutex *mutex;         /* lock when modifying struct! */
+    gboolean abort;        /* TRUE = abort                */
+    Track *track;          /* Current track               */
+    GPid converter_pid;    /* Converter used for track    */
+} TransferData;
+
+
 #ifdef G_THREADS_ENABLED
 /* Thread specific */
-static  GMutex *mutex = NULL;
+static GMutex *mutex = NULL;
 static GCond  *cond = NULL;
 static gboolean mutex_data = FALSE;
 #endif
@@ -92,10 +101,50 @@
 static GList *extendeddeletion = NULL;
 static float extendedinfoversion = 0.0;
 
+static volatile GtkWidget *details_log; /* Details log on file dialog */
 
 /* Some declarations */
 static gboolean gp_write_itdb (iTunesDB *itdb);
 
+void details_log_append(gchar *text) 
+{
+  GtkTextBuffer *buf;
+  GtkTextIter start, end;
+  gchar *ptr = text, *next;
+
+  g_return_if_fail (GTK_IS_TEXT_VIEW(details_log));
+
+  buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (details_log));
+  gtk_text_buffer_get_end_iter (buf, &end);
+  while (*ptr) {
+    if (!details_log) return;
+    next = g_utf8_find_next_char (ptr, NULL);
+    if (*ptr == '\b') {
+      start = end;
+      if (gtk_text_iter_backward_char (&start))
+         gtk_text_buffer_delete (buf, &start, &end);
+    }
+    else if(*ptr == '\r') {
+      start = end;
+      gtk_text_iter_set_line_offset (&start, 0);
+      gtk_text_buffer_delete (buf, &start, &end);
+    }
+    else gtk_text_buffer_insert (buf, &end, ptr, next - ptr);
+    ptr = next;
+  }
+  gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW (details_log), &end, 0.0, FALSE, 
0.0, 0.0); 
+}
+
+void details_log_clear(void) 
+{
+  GtkTextBuffer *buf;
+
+  g_return_if_fail (GTK_IS_TEXT_VIEW(details_log));
+
+  buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (details_log));
+  gtk_text_buffer_set_text (buf, "", -1);
+}
+
 
 /* fills in extended info if available */
 /* num/total are used to give updates in case the md5 checksums have
@@ -1155,6 +1204,20 @@
 }
 
 
+TransferData *transfer_data_new (void)
+{
+    TransferData *transfer_data;
+    transfer_data = g_new0 (TransferData, 1);
+    transfer_data->mutex = g_mutex_new ();
+    transfer_data->converter_pid = -1;
+    return transfer_data;
+}
+
+void transfer_data_free (TransferData *transfer_data)
+{
+    if (transfer_data->mutex) g_mutex_free (transfer_data->mutex);
+    g_free (transfer_data);
+}
 
 #ifdef G_THREADS_ENABLED
 /* Threaded remove file */
@@ -1172,31 +1235,31 @@
 }
 #endif
 
-
 /* Threaded copy of ipod track */
 /* Returns: GError *error */
 static gpointer th_copy (gpointer data)
 {
-    Track *track = data;
+    TransferData *transfer_data = data;
+    Track *track;
     ExtraTrackData *etr;
     FileType type;
     TrackConv *converter = NULL;
     GError *error = NULL;
+    g_return_val_if_fail (transfer_data, NULL);
+    track = transfer_data->track;
     g_return_val_if_fail (track, NULL);
     etr = track->userdata;
     g_return_val_if_fail (etr, NULL);
     const gchar *file_to_transfer=etr->pc_path_locale;
+    gboolean convert = FALSE;
 
     /* check if we need to convert the file */
     type = determine_file_type (file_to_transfer);
     switch (type)
     {
     case FILE_TYPE_UNKNOWN:
-    case FILE_TYPE_MP3:
-    case FILE_TYPE_M4A:
     case FILE_TYPE_M4P:
     case FILE_TYPE_M4B:
-    case FILE_TYPE_WAV:
     case FILE_TYPE_M4V:
     case FILE_TYPE_MP4:
     case FILE_TYPE_MOV:
@@ -1205,21 +1268,45 @@
     case FILE_TYPE_PLS:
     case FILE_TYPE_IMAGE:
     case FILE_TYPE_DIRECTORY:
-       converter = NULL;
        break;
+    case FILE_TYPE_M4A:
+       convert = prefs_get_int ("convert_m4a");
+       break;
+    case FILE_TYPE_WAV:
+       convert = prefs_get_int ("convert_wav");
+       break;
+    case FILE_TYPE_MP3:
+       convert = prefs_get_int ("convert_mp3");
+       break;
     case FILE_TYPE_OGG:
+       convert = prefs_get_int ("convert_ogg");
+       break;
     case FILE_TYPE_FLAC:
+       convert = prefs_get_int ("convert_flac");
+       break;
+    }
+
+    if (convert)
+    {
        converter = g_new0 (TrackConv, 1);
        converter->type = type;
        converter->track = track;
        error = file_convert_pre_copy (converter);
         if (!error) 
         {
+           g_mutex_lock (transfer_data->mutex);
+           transfer_data->converter_pid = converter->child_pid;
+           g_mutex_unlock (transfer_data->mutex);
+
             error = file_convert_wait_for_conversion (converter);
+
+           g_mutex_lock (transfer_data->mutex);
+           transfer_data->converter_pid = -1;
+           g_mutex_unlock (transfer_data->mutex);
+
             if (!error)
                 file_to_transfer = converter->converted_file;
         }
-       break;
     }
 
     if (error == NULL)
@@ -1246,11 +1333,22 @@
 
 /* This function is called when the user presses the abort button
  * during flush_tracks() */
-static void file_dialog_abort (gboolean *abort_flag)
+static void file_dialog_abort (TransferData *transfer_data)
 {
-    *abort_flag = TRUE;
-}
+    g_return_if_fail (transfer_data);
+
+    g_mutex_lock (transfer_data->mutex);
+
+    transfer_data->abort = TRUE;
+
+    /* kill conversion if in progress */
+    if (transfer_data->converter_pid != -1)
+    {
+       kill (transfer_data->converter_pid, SIGTERM);
+    }
 
+    g_mutex_unlock (transfer_data->mutex);
+}
 
 /* check if iPod directory stucture is present */
 static gboolean ipod_dirs_present (const gchar *mountpoint)
@@ -1282,9 +1380,10 @@
 
 
 static GtkWidget *create_file_dialog (GtkWidget **progress_bar,
-                                     gboolean *abort_flag)
+                                     GtkWidget **text_view,
+                                     TransferData *transfer_data)
 {
-  GtkWidget *dialog, *label, *image, *hbox;
+  GtkWidget *dialog, *label, *image, *hbox, *expander, *scrolled_window;
 
   /* create the dialog window */
   dialog = gtk_dialog_new_with_buttons (_("Information"),
@@ -1310,20 +1409,32 @@
   gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
 
   /* Create the progress bar */
-  if (progress_bar)
+  if (progress_bar) {
       *progress_bar = gtk_progress_bar_new ();
+      gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
+                         *progress_bar, FALSE, FALSE, 0);
+  }
+
+  /* Create details log */
+  if (text_view) {
+      expander = gtk_expander_new (_("Details..."));
+      scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+      *text_view = gtk_text_view_new();
+      gtk_container_add (GTK_CONTAINER (scrolled_window), *text_view);
+      gtk_container_add (GTK_CONTAINER (expander), scrolled_window);
+      gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
+                      expander, TRUE, TRUE, 0);
+  }
 
   /* Indicate that user wants to abort */
   g_signal_connect_swapped (GTK_OBJECT (dialog), "response",
                            G_CALLBACK (file_dialog_abort),
-                           abort_flag);
+                           transfer_data);
 
   /* Add the image/label + progress bar to dialog */
   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
                       hbox, FALSE, FALSE, 0);
-  if (progress_bar)
-      gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
-                         *progress_bar, FALSE, FALSE, 0);
+
   gtk_widget_show_all (dialog);
 
   return dialog;
@@ -1339,7 +1450,7 @@
   GtkWidget *dialog, *progress_bar;
   gchar *progtext = NULL;
   gboolean result = TRUE;
-  static gboolean abort_flag;
+  TransferData *transfer_data;
   ExtraiTunesDBData *eitdb;
 #ifdef G_THREADS_ENABLED
   GThread *thread = NULL;
@@ -1348,8 +1459,6 @@
   if (!cond) cond = g_cond_new ();
 #endif
 
-
-
   g_return_val_if_fail (itdb, FALSE);
   eitdb = itdb->userdata;
   g_return_val_if_fail (eitdb, FALSE);
@@ -1364,16 +1473,16 @@
       g_return_val_if_fail (itdb_get_mountpoint (itdb), FALSE);
   }
 
-  abort_flag = FALSE;
+  transfer_data = transfer_data_new ();
 
-  dialog = create_file_dialog (&progress_bar, &abort_flag);
+  dialog = create_file_dialog (&progress_bar, NULL, transfer_data);
   progtext = g_strdup (_("deleting..."));
   gtk_progress_bar_set_text(GTK_PROGRESS_BAR (progress_bar), progtext);
   while (widgets_blocked && gtk_events_pending ())  gtk_main_iteration ();
   g_free (progtext);
 
   /* lets clean up those pending deletions */
-  while (!abort_flag && eitdb->pending_deletion)
+  while (!transfer_data->abort && eitdb->pending_deletion)
   {
       gchar *filename = NULL;
       Track *track = eitdb->pending_deletion->data;
@@ -1407,6 +1516,10 @@
                  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));
@@ -1432,7 +1545,8 @@
          gtk_main_iteration ();
   }
   gtk_widget_destroy (dialog);
-  if (abort_flag) result = FALSE;
+  if (transfer_data->abort) result = FALSE;
+  transfer_data_free (transfer_data);
   return result;
 }
 
@@ -1447,7 +1561,7 @@
   GList *gl;
   gint count, n;
   gboolean result = TRUE;
-  static gboolean abort_flag;
+  TransferData *transfer_data;
   GtkWidget *dialog, *progress_bar;
   time_t start;
   gchar *progtext = NULL;
@@ -1465,33 +1579,42 @@
 
   n = itdb_tracks_number_nontransferred (itdb);
 
-  if (n==0) return TRUE;
+  if (n == 0) return TRUE;
+
+  transfer_data = transfer_data_new ();
 
-  abort_flag = FALSE;
   /* create the dialog window */
-  dialog = create_file_dialog (&progress_bar, &abort_flag);
+  dialog = create_file_dialog (&progress_bar,
+                              (GtkWidget**)&details_log,
+                              transfer_data);
   progtext = g_strdup (_("preparing to copy..."));
   gtk_progress_bar_set_text (GTK_PROGRESS_BAR (progress_bar), progtext);
   while (widgets_blocked && gtk_events_pending ())  gtk_main_iteration ();
   g_free (progtext);
 
+  transfer_data->abort = FALSE;
+
   /* count number of tracks to be transferred */
   count = 0; /* tracks transferred */
   start = time (NULL);
 
-  for (gl=itdb->tracks; gl && !abort_flag; gl=gl->next)
+  for (gl=itdb->tracks; gl && !transfer_data->abort; gl=gl->next)
   {
       time_t diff, fullsecs, hrs, mins, secs;
       Track *track = gl->data;
       g_return_val_if_fail (track, FALSE); /* this will hang the
                                              application :-( */
+      g_mutex_lock (transfer_data->mutex);
+      transfer_data->track = track;
+      g_mutex_unlock (transfer_data->mutex);
+
       if (!track->transferred)             /* but this would crash
                                              it otherwise... */
       {
          GError *error = NULL;
 #ifdef G_THREADS_ENABLED
          mutex_data = FALSE;
-         thread = g_thread_create (th_copy, track, TRUE, NULL);
+         thread = g_thread_create (th_copy, transfer_data, TRUE, NULL);
          if (thread)
          {
              g_mutex_lock (mutex);
@@ -1509,18 +1632,20 @@
          }
          else {
              g_warning ("Thread creation failed, falling back to default.\n");
-             error = th_copy (track);
+             error = th_copy (transfer_data);
          }
 #else
-         error = th_copy (track);
+         error = th_copy (transfer_data);
 #endif
          if (error)
          {   /* an error occurred */
-             result = FALSE;
-             if (error->message)
-                 gtkpod_warning ("%s\n\n", error->message);
-             else
-                 g_warning ("error->message == NULL!\n");
+             if(!transfer_data->abort) {
+                 result = FALSE;
+                 if (error->message)
+                     gtkpod_warning ("%s\n\n", error->message);
+                 else
+                     g_warning ("error->message == NULL!\n");
+             }
              g_error_free (error);
          }
          data_changed (itdb); /* otherwise new free space status from
@@ -1561,12 +1686,14 @@
       while (widgets_blocked && gtk_events_pending ())  gtk_main_iteration ();
   } /* for (.;.;.) */
 
-  if (abort_flag)      result = FALSE;   /* negative result if user aborted */
+  if (transfer_data->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);
   gtk_widget_destroy (dialog);
   while (widgets_blocked && gtk_events_pending ())  gtk_main_iteration ();
+
+  g_free (transfer_data);
   return result;
 }
 

Index: prefs.c
===================================================================
RCS file: /cvsroot/gtkpod/gtkpod/src/prefs.c,v
retrieving revision 1.273
retrieving revision 1.274
diff -u -d -r1.273 -r1.274
--- prefs.c     16 Jan 2007 09:45:00 -0000      1.273
+++ prefs.c     5 Feb 2007 08:46:00 -0000       1.274
@@ -1,4 +1,4 @@
-/* Time-stamp: <2007-01-16 18:34:24 jcs>
+/* Time-stamp: <2007-02-05 17:42:24 jcs>
 |
 |  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
 |  Copyright (C) 2006 James Liggett <jrliggett at cox.net>
@@ -160,10 +160,17 @@
     str = g_build_filename (SCRIPTDIR, "convert-ogg2mp3.sh", NULL);
     prefs_set_string ("path_conv_ogg", str);
     g_free (str);
+    prefs_set_int ("convert_ogg", TRUE);
 
     str = g_build_filename (SCRIPTDIR, "convert-flac2mp3.sh", NULL);
     prefs_set_string ("path_conv_flac", str);
     g_free (str);
+    prefs_set_int ("convert_flac", TRUE);
+
+    str = g_build_filename (SCRIPTDIR, "convert-wav2mp3.sh", NULL);
+    prefs_set_string ("path_conv_wav", str);
+    g_free (str);
+    prefs_set_int ("convert_wav", FALSE);
 
 
     /* Set sorting tab defaults */

Index: prefs_window.c
===================================================================
RCS file: /cvsroot/gtkpod/gtkpod/src/prefs_window.c,v
retrieving revision 1.189
retrieving revision 1.190
diff -u -d -r1.189 -r1.190
--- prefs_window.c      16 Jan 2007 09:45:00 -0000      1.189
+++ prefs_window.c      5 Feb 2007 08:46:00 -0000       1.190
@@ -67,7 +67,18 @@
 static void standard_toggle_toggled (GtkToggleButton *togglebutton,
                                     const gchar *key);
 
+static void on_convert_toggle_toggled (GtkToggleButton *togglebutton,
+                                    gpointer not_used);
 
+static const gchar *convert_names[] =
+{
+    "convert_ogg",
+    "convert_flac",
+    "convert_m4a",
+    "convert_mp3",
+    "convert_wav",
+    NULL
+};
 
 /* Definition of path button names.
    path_fileselector_titles[] specifies the title for the file
@@ -84,6 +95,9 @@
     "mserv_trackinfo_root_button",
     "path_conv_ogg_button",
     "path_conv_flac_button",
+    "path_conv_m4a_button",
+    "path_conv_mp3_button",
+    "path_conv_wav_button",
     NULL
 };
 static const gchar *path_key_names[] =
@@ -96,6 +110,9 @@
     "path_mserv_trackinfo_root",
     "path_conv_ogg",
     "path_conv_flac",
+    "path_conv_m4a",
+    "path_conv_mp3",
+    "path_conv_wav",
     NULL
 };
 const gchar *path_entry_names[] =
@@ -108,6 +125,9 @@
     "mserv_trackinfo_root_entry",
     "path_conv_ogg_entry",
     "path_conv_flac_entry",
+    "path_conv_m4a_entry",
+    "path_conv_mp3_entry",
+    "path_conv_wav_entry",
     NULL
 };
 static const gchar *path_fileselector_titles[] =
@@ -120,6 +140,9 @@
     N_("Select the mserv trackinfo root directory"),
     N_("Select the ogg/vorbis converter command"),
     N_("Select the flac converter command"),
+    N_("Select the m4a converter command."),
+    N_("Select the mp3 converter command."),
+    N_("Select the wav converter command."),
     NULL
 };
 static const GtkFileChooserAction path_type[] =
@@ -132,6 +155,9 @@
     GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
     GTK_FILE_CHOOSER_ACTION_OPEN,
     GTK_FILE_CHOOSER_ACTION_OPEN,
+    GTK_FILE_CHOOSER_ACTION_OPEN,
+    GTK_FILE_CHOOSER_ACTION_OPEN,
+    GTK_FILE_CHOOSER_ACTION_OPEN,
     -1
 };
 
@@ -267,7 +293,19 @@
     else                                     gtk_tooltips_disable (tt);
 }
 
+static void convert_table_set_children_initial_sensitivity (GtkTable *table)
+{
+    GList *list_item;
+    GtkTableChild *child;
 
+    list_item = table->children;
+    while (list_item) {
+        child = (GtkTableChild*)list_item->data;
+        gtk_widget_set_sensitive (child->widget, 
+                                     GTK_IS_TOGGLE_BUTTON (child->widget));
+        list_item = g_list_next (list_item);
+    }
+}
 
 /**
  * create_gtk_prefs_window
@@ -690,9 +728,25 @@
        gtk_entry_set_text(GTK_ENTRY(w), buf);
        g_free(buf);
     }
-    
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "convert_table");
+    convert_table_set_children_initial_sensitivity (GTK_TABLE (w));
+    for (i=0; convert_names[i]; ++i)
+    {
+         w = gtkpod_xml_get_widget (prefs_window_xml, convert_names[i]);
+         g_signal_connect ((gpointer)w,
+                             "toggled",
+                             G_CALLBACK (on_convert_toggle_toggled),
+                             NULL);
+         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), prefs_get_int 
(convert_names[i]) );
+
+    }
+
     prefs_window_show_hide_tooltips ();
     gtk_widget_show(prefs_window);
+
+
+
 }
 
 
@@ -1064,6 +1118,45 @@
                        gtk_toggle_button_get_active (togglebutton));
 }
 
+static void on_convert_toggle_toggled (GtkToggleButton *togglebutton,
+                                    gpointer not_used)
+{
+    GtkTable *parent;
+    GList *list_item;
+    GtkTableChild *child;
+    guint16 row = 0;
+    gboolean active;
+
+    parent = (GtkTable*)gtk_widget_get_parent (GTK_WIDGET (togglebutton));    
+    g_return_if_fail (GTK_IS_TABLE (parent));
+
+    /* Find row of togglebutton */
+    list_item = parent->children;
+    while (list_item) {
+        child = (GtkTableChild*)list_item->data;
+        if (child->widget == (GtkWidget*)togglebutton) {
+            row = child->top_attach;
+            break;
+        }
+        list_item = g_list_next (list_item);
+    }
+
+    active = gtk_toggle_button_get_active (togglebutton);
+
+    temp_prefs_set_int (temp_prefs, gtk_widget_get_name (GTK_WIDGET 
(togglebutton)), 
+                       active);
+
+    /* set sensitivity of all widgets on togglebuttons row, except 
togglebutton */
+    list_item = parent->children;
+    while (list_item) {
+        child = (GtkTableChild*)list_item->data;
+        if (child->top_attach == row && child->widget != 
(GtkWidget*)togglebutton) 
+            gtk_widget_set_sensitive (child->widget, active);
+        list_item = g_list_next (list_item);
+    }
+}
+
+
 void
 on_sync_confirm_delete_toggled     (GtkToggleButton *togglebutton,
                                    gpointer         user_data)


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier.
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
gtkpod-cvs2 mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2

Reply via email to