commit c0b8817a3378046c4cbe45cb5c214c18df9fc1ea
Merge: ae4cb23 7ab31fe
Author: Paul Richardson aka phantomjinx <p.g.richard...@phantomjinx.co.uk>
Date:   Sun Apr 18 20:11:00 2010 +0100

    Merge branch 'master' into plugin-framework
    
    Conflicts:
        configure.in
        src/Makefile.am
        src/autodetection.c
        src/display_itdb.c
        src/file.c
        src/file_itunesdb.c
        src/mp4file.c

 CMakeLists.txt           |   27 ++----
 ChangeLog                |  124 ++++++++++++++++++++++++
 NEWS                     |   22 ++++
 cmake/FindGIO.cmake      |    3 +
 cmake/FindGnomeVFS.cmake |    3 -
 cmake/FindHAL.cmake      |    3 -
 configure.in             |   73 +++++++-------
 src/autodetection.c      |  236 +++++++++++----------------------------------
 src/details.c            |   33 +++++++
 src/display_itdb.c       |   31 +++---
 src/file.c               |  241 ++++++++++++++++++++++++++--------------------
 src/file_itunesdb.c      |    1 -
 src/mp4file.c            |  205 +++++++++++++++++++++++++++++++++++++--
 src/oggfile.c            |    1 +
 14 files changed, 634 insertions(+), 369 deletions(-)
---
diff --cc configure.in
index b8f4dc9,82df9d8..818af39
--- a/configure.in
+++ b/configure.in
@@@ -235,6 -175,6 +224,17 @@@ els
      have_flac="*no -- will build without FLAC support"
  fi
  
++dnl Check for MP4 Headers
++AC_CHECK_HEADERS([mp4v2/platform.h])
++AC_CHECK_HEADERS([mp4v2/itmf_tags.h], [], [],
++               [#ifdef HAVE_MP4V2_PLATFORM_H
++                # include <mp4v2/platform.h>
++                #endif
++                typedef void* MP4FileHandle;
++               ])
++
++AC_CHECK_HEADERS([endian.h])
++
  dnl Additional libs maybe needed when compiling under solaris
  AC_SEARCH_LIBS(bind, ["socket" "nsl" "socket -lnsl"])
  
diff --cc src/autodetection.c
index 5f23645,39b1171..94ac6a2
--- a/src/autodetection.c
+++ b/src/autodetection.c
@@@ -25,26 -25,17 +25,22 @@@
  |
  |  $Id$
  */
 +#ifdef HAVE_CONFIG_H
 +#  include <config.h>
 +#endif
  
 -
 +#include <stdio.h>
 +#include <string.h>
 +#include <glib/gi18n-lib.h>
  #include "autodetection.h"
 -#include "config.h"
 +#include "gp_itdb.h"
 +#include "gtkpod_app_iface.h"
  #include "misc.h"
  #include "prefs.h"
 -#include <stdio.h>
 -#include <string.h>
 +
  
- #ifdef HAVE_GNOME_VFS
- #include <libgnomevfs/gnome-vfs.h>
- #endif
- #ifdef HAVE_HAL
- #include <libhal.h>
- #include <dbus/dbus.h>
+ #ifdef HAVE_GIO
+ #include <gio/gio.h>
  #endif
  
  #undef DEBUG_AUTO
@@@ -369,13 -240,17 +245,17 @@@ static gboolean ad_timeout_cb (gpointe
  
            g_return_val_if_fail (mount_uri, (gdk_threads_leave(), 
release_widgets(), TRUE));
  
-           mountpoint = g_filename_from_uri (mount_uri, NULL, NULL);
+           GFile *muri = g_file_parse_name (mount_uri);
+           mountpoint = g_file_get_path (muri);
+           g_object_unref (muri);
            g_free (mount_uri);
-           debug ("Mounted iPod at '%s'\n", mountpoint);
  
-           itdb = ad_find_repository_with_mountpoint (mountpoint);
+           if (mountpoint) {
+               debug ("Mounted iPod at '%s'\n", mountpoint);
+               itdb = ad_find_repository_with_mountpoint (mountpoint);
+           }
  
 -          itdbs = gp_get_itdbs_head (gtkpod_window);
 +          itdbs = gp_get_itdbs_head ();
            g_return_val_if_fail (itdbs, (gdk_threads_leave(), 
release_widgets(), TRUE));
  
            block_widgets ();
diff --cc src/display_itdb.c
index f0526c7,2a9af53..ffd42e1
--- a/src/display_itdb.c
+++ b/src/display_itdb.c
@@@ -763,40 -854,42 +763,41 @@@ void gp_init(GtkPodApp *single_app, in
  
      itdbs_head = g_new0 (struct itdbs_head, 1);
  
 -    g_object_set_data (G_OBJECT (window), "itdbs_head", itdbs_head);
 +    g_object_set_data(G_OBJECT (gtkpod_app), "itdbs_head", itdbs_head);
  
-     if (!prefs_get_int_value("itdb_0_type", NULL)) {
-         /* databases have not been set up previously -- take care of
-          this */
- #ifndef HAVE_GNOME_VFS
-         gchar *mountpoint;
+     if (!prefs_get_int_value ("itdb_0_type", NULL))
+     {
+       /* databases have not been set up previously -- take care of
+          this */
+ #ifndef HAVE_GIO
+       gchar *mountpoint;
  #endif
 -      gchar *filename;
 -
 -      /* Local database */
 -      filename = g_build_filename (cfgdir, "local_0.itdb", NULL);
 -      prefs_set_int ("itdb_0_type", GP_ITDB_TYPE_LOCAL);
 -      prefs_set_string ("itdb_0_name", _("Music Library"));
 -      prefs_set_string ("itdb_0_filename", filename);
 -      g_free (filename);
 -
 -      /* Podcasts database */
 -      filename = g_build_filename (cfgdir, "podcasts.itdb", NULL);
 -      prefs_set_int ("itdb_1_type",
 -                     GP_ITDB_TYPE_PODCASTS|GP_ITDB_TYPE_LOCAL);
 -      prefs_set_string ("itdb_1_name", _("Podcasts"));
 -      prefs_set_string ("itdb_1_filename", filename);
 -      g_free (filename);
 +        gchar *filename;
 +
 +        /* Local database */
 +        filename = g_build_filename(cfgdir, "local_0.itdb", NULL);
 +        prefs_set_int("itdb_0_type", GP_ITDB_TYPE_LOCAL);
 +        prefs_set_string("itdb_0_name", _("Music Library"));
 +        prefs_set_string("itdb_0_filename", filename);
 +        g_free(filename);
 +
 +        /* Podcasts database */
 +        filename = g_build_filename(cfgdir, "podcasts.itdb", NULL);
 +        prefs_set_int("itdb_1_type", GP_ITDB_TYPE_PODCASTS | 
GP_ITDB_TYPE_LOCAL);
 +        prefs_set_string("itdb_1_name", _("Podcasts"));
 +        prefs_set_string("itdb_1_filename", filename);
 +        g_free(filename);
  
- #ifndef HAVE_GNOME_VFS
-         /* iPod database -- only set up if autodetection is not active */
-         mountpoint = prefs_get_string ("initial_mountpoint");
-         filename = g_build_filename (cfgdir, "iTunesDB", NULL);
-         prefs_set_int ("itdb_2_type", GP_ITDB_TYPE_IPOD);
-         prefs_set_string ("itdb_2_name", _("iPod"));
-         prefs_set_string ("itdb_2_filename", filename);
-         prefs_set_string ("itdb_2_mountpoint", mountpoint);
-         g_free (mountpoint);
-         g_free (filename);
+ #ifndef HAVE_GIO
+       /* iPod database -- only set up if autodetection is not active */
+       mountpoint = prefs_get_string ("initial_mountpoint");
+       filename = g_build_filename (cfgdir, "iTunesDB", NULL);
+       prefs_set_int ("itdb_2_type", GP_ITDB_TYPE_IPOD);
+       prefs_set_string ("itdb_2_name", _("iPod"));
+       prefs_set_string ("itdb_2_filename", filename);
+       prefs_set_string ("itdb_2_mountpoint", mountpoint);
+       g_free (mountpoint);
+       g_free (filename);
  #endif
      }
  
diff --cc src/file.c
index b7157b3,940543e..6c964af
--- a/src/file.c
+++ b/src/file.c
@@@ -1173,47 -1297,55 +1173,52 @@@ static Track *get_track_info_from_file(
      }
  
      /* reset the auto detection charset (see explanation in charset.c) */
 -    charset_reset_auto ();
 +    charset_reset_auto();
  
      /* check for filetype */
 -    len = strlen (name);
 -    if (len < 4) return NULL;
 +    len = strlen(name);
 +    if (len < 4)
 +        return NULL;
  
      filetype = determine_file_type(name);
 -    switch (filetype)
 -    {
 +    switch (filetype) {
      case FILE_TYPE_MP3:
-         nti = mp3_get_file_info(name);
-         /* Set mediatype to audio */
-         if (nti)
-             nti->mediatype = ITDB_MEDIATYPE_AUDIO;
-         break;
+       nti = mp3_get_file_info (name);
+       /* Set mediatype to audio */
+       if (nti)
+       {
+           if (g_strcasecmp (nti->genre, "audiobook") == 0) nti->mediatype = 
ITDB_MEDIATYPE_AUDIOBOOK;
+           else if (g_strcasecmp (nti->genre, "podcast") == 0) nti->mediatype 
= ITDB_MEDIATYPE_PODCAST;
+           else nti->mediatype = ITDB_MEDIATYPE_AUDIO;
+       }
+       break;
      case FILE_TYPE_M4A:
      case FILE_TYPE_M4P:
-         nti = mp4_get_file_info(name);
-         /* Set mediatype to audio */
-         if (nti) {
-             nti->mediatype = ITDB_MEDIATYPE_AUDIO;
-         }
-         break;
+       nti = mp4_get_file_info (name);
+       /* Set mediatype to audio */
+       if (nti && !nti->mediatype)
+       {
+           nti->mediatype = ITDB_MEDIATYPE_AUDIO;
+       }
+       break;
      case FILE_TYPE_M4B:
 -      nti = mp4_get_file_info (name);
 -      /* Set mediatype to audiobook */
 -      if (nti)
 -      {
 -          nti->mediatype = ITDB_MEDIATYPE_AUDIOBOOK;
 -      }
 -      break;
 +        nti = mp4_get_file_info(name);
 +        /* Set mediatype to audiobook */
 +        if (nti) {
 +            nti->mediatype = ITDB_MEDIATYPE_AUDIOBOOK;
 +        }
 +        break;
      case FILE_TYPE_WAV:
 -      nti = wav_get_file_info (name);
 -      /* Set mediatype to audio */
 -      if (nti)
 -      {
 -          nti->mediatype = ITDB_MEDIATYPE_AUDIO;
 -      }
 -      break;
 +        nti = wav_get_file_info(name);
 +        /* Set mediatype to audio */
 +        if (nti) {
 +            nti->mediatype = ITDB_MEDIATYPE_AUDIO;
 +        }
 +        break;
      case FILE_TYPE_OGG:
 -        nti = ogg_get_file_info (name);
 +        nti = ogg_get_file_info(name);
          /* Set mediatype to audio */
 -        if (nti)
 -        {
 +        if (nti) {
              nti->mediatype = ITDB_MEDIATYPE_AUDIO;
          }
          break;
@@@ -1226,31 -1359,33 +1231,32 @@@
          break;
      case FILE_TYPE_M4V:
      case FILE_TYPE_MP4:
-         /* I don't know if .m4v and .mp4 can simply be handled like
-          this. Let's see if someone complains. */
-         nti = mp4_get_file_info(name);
-         if (!nti)
-             video_get_file_info(name);
-         /* Set mediatype to video */
-         if (nti) {
+       /* I don't know if .m4v and .mp4 can simply be handled like
+          this. Let's see if someone complains. */
+       nti = mp4_get_file_info (name);
+       if (!nti) video_get_file_info (name);
+       /* Set mediatype to video */
+       if (nti)
+       {
+           if (!nti->mediatype)
              nti->mediatype = ITDB_MEDIATYPE_MOVIE;
-             nti->movie_flag = 0x01;
-         }
-         break;
+           nti->movie_flag = 0x01;
+       }       
+       break;
      case FILE_TYPE_MOV:
      case FILE_TYPE_MPG:
 -      /* for now treat all the same */
 -      nti = video_get_file_info (name);
 -      /* Set mediatype to video */
 -      if (nti)
 -      {
 -          nti->mediatype = ITDB_MEDIATYPE_MOVIE;
 -          nti->movie_flag = 0x01;
 -      }
 -      break;
 +        /* for now treat all the same */
 +        nti = video_get_file_info(name);
 +        /* Set mediatype to video */
 +        if (nti) {
 +            nti->mediatype = ITDB_MEDIATYPE_MOVIE;
 +            nti->movie_flag = 0x01;
 +        }
 +        break;
      case FILE_TYPE_UNKNOWN:
 -      gtkpod_warning (_("The following track could not be processed (filetype 
unknown): '%s'\n"), name_utf8);
 -      g_free (name_utf8);
 -      return NULL;
 +        gtkpod_warning(_("The following track could not be processed 
(filetype unknown): '%s'\n"), name_utf8);
 +        g_free(name_utf8);
 +        return NULL;
      case FILE_TYPE_IMAGE:
      case FILE_TYPE_DIRECTORY:
      case FILE_TYPE_M3U:
diff --cc src/file_itunesdb.c
index 54797ca,d33c948..bc04ff0
--- a/src/file_itunesdb.c
+++ b/src/file_itunesdb.c
@@@ -1575,258 -1819,313 +1575,257 @@@ static gboolean transfer_tracks(iTunesD
      return result;
  }
  
 +static gboolean gp_write_itdb(iTunesDB *itdb) {
 +    gchar *cfgdir;
 +    gboolean success = TRUE;
 +    ExtraiTunesDBData *eitdb;
 +    GtkWidget *dialog;
 +    Playlist *mpl;
 +    TransferData *transferdata;
  
 +    g_return_val_if_fail (itdb, FALSE);
 +    eitdb = itdb->userdata;
 +    g_return_val_if_fail (eitdb, FALSE);
  
 -static gboolean gp_write_itdb (iTunesDB *itdb)
 -{
 -  gchar *cfgdir;
 -  gboolean success = TRUE;
 -  ExtraiTunesDBData *eitdb;
 -  GtkWidget *dialog;
 -  Playlist *mpl;
 -  TransferData *transferdata;
 -
 -  g_return_val_if_fail (itdb, FALSE);
 -  eitdb = itdb->userdata;
 -  g_return_val_if_fail (eitdb, FALSE);
 -
 -  cfgdir = prefs_get_cfgdir ();
 -  g_return_val_if_fail (cfgdir, FALSE);
 -
 -  mpl = itdb_playlist_mpl (itdb);
 -  g_return_val_if_fail (mpl, FALSE);
 -
 -  if (!eitdb->itdb_imported)
 -  {   /* No iTunesDB was read but user wants to export current
 -         data. If an iTunesDB is present on the iPod or in cfgdir,
 -       this is most likely an error. We should tell the user */
 -      gchar *tunes = NULL;
 -      /* First check if we can find an existing iTunesDB. */
 -      if (itdb->usertype & GP_ITDB_TYPE_LOCAL)
 -      {
 -        tunes = g_strdup (itdb->filename);
 -      }
 -      else if (itdb->usertype & GP_ITDB_TYPE_IPOD)
 -      {
 -        if (get_offline (itdb))
 -        {
 -            tunes = g_strdup (eitdb->offline_filename);
 -        }
 -        else
 -        {
 -            const gchar *mountpoint = itdb_get_mountpoint (itdb);
 -            g_return_val_if_fail (mountpoint, FALSE);
 -            tunes = itdb_get_itunesdb_path (mountpoint);
 -        }
 -      }
 -      else
 -      {
 -        g_free (cfgdir);
 -        g_return_val_if_reached (FALSE);
 -      }
 -      if (g_file_test (tunes, G_FILE_TEST_EXISTS))
 -      {
 -                gchar *str = g_strdup_printf (_("You did not import the 
existing iTunesDB ('%s'). This is most likely incorrect and will result in the 
loss of the existing database.\n\nIf you skip storing, you can import the 
existing database before calling this function again.\n"), tunes);
 -
 -                gint result = gtkpod_confirmation_hig (GTK_WINDOW 
(gtkpod_window),
 -                                                                              
             GTK_MESSAGE_WARNING,
 -                                                                              
             _("Existing iTunes database not imported"),
 -                                                                              
             str,
 -                                                                              
             _("Proceed anyway"),
 -                                                                              
                 _("Skip storing"),
 -                                                                              
                 NULL,
 -                                                                              
                 NULL);
 -
 -                g_free (str);
 -
 -                if (result == GTK_RESPONSE_CANCEL)
 -                {
 -                        g_free (cfgdir);
 -                        return FALSE;
 -                }
 -      }
 -  }
 -
 -  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))
 -  {
 -      const gchar *mountpoint = itdb_get_mountpoint (itdb);
 -      g_return_val_if_fail (mountpoint, FALSE);
 -      /* check if iPod directories are present */
 -      if (!ipod_dirs_present (mountpoint))
 -      {   /* no -- create them */
 -        gp_ipod_init (itdb);
 -        /* if still not present abort */
 -        if (!ipod_dirs_present (mountpoint))
 -        {
 -            gtkpod_warning (_("iPod directory structure must be present 
before synching to the iPod can be performed.\n"));
 -            success = FALSE;
 -        }
 -      }
 -      if (success)
 -      {   /* remove deleted files */
 -        success = delete_files (itdb, transferdata);
 -        if (!success)
 -        {
 -            gtkpod_warning (_("Some tracks could not be deleted from the 
iPod. Export aborted!"));
 -        }
 -      }
 -      if (success)
 -      {
 -        /* write tracks to iPod */
 -        success = transfer_tracks (itdb, transferdata);
 -      }
 -  }
 -
 -  if (itdb->usertype & GP_ITDB_TYPE_LOCAL)
 -  {
 -      success = delete_files (itdb, transferdata);
 -  }
 -
 -  if (success)
 -  {
 -      gchar *buf;
 -      buf = g_strdup_printf (_("Now writing database '%s'. Please wait..."), 
mpl->name);
 -      gtk_label_set_text (GTK_LABEL (transferdata->textlabel), buf);
 -      g_free (buf);
 -
 -      while (widgets_blocked && gtk_events_pending ())
 -        gtk_main_iteration ();
 -  }
 -
 -  if (success && !get_offline (itdb) &&
 -      (itdb->usertype & GP_ITDB_TYPE_IPOD))
 -  {   /* write to the iPod */
 -      GError *error = NULL;
 -      if (!itdb_write (itdb, &error))
 -      {   /* an error occurred */
 -        success = FALSE;
 -        if (error && error->message)
 -            gtkpod_warning ("%s\n\n", error->message);
 -        else
 -            g_warning ("error->message == NULL!\n");
 -        g_error_free (error);
 -        error = NULL;
 -      }
 -
 -      if (success)
 -      {   /* write shuffle data */
 -        if (!itdb_shuffle_write (itdb, &error))
 -        {   /* an error occurred */
 -            success = FALSE;
 -            if (error && error->message)
 -                gtkpod_warning ("%s\n\n", error->message);
 -            else
 -                g_warning ("error->message == NULL!\n");
 -            g_error_free (error);
 -            error = NULL;
 -        }
 -      }
 -      if (success)
 -      {
 -        if (WRITE_EXTENDED_INFO)
 -        {   /* write extended information */
 -            success = write_extended_info (itdb);
 -        }
 -        else
 -        {   /* delete extended information if present */
 -            gchar *ext = g_strdup_printf ("%s.ext", itdb->filename);
 -            if (g_file_test (ext, G_FILE_TEST_EXISTS))
 -            {
 -                if (remove (ext) != 0)
 -                {
 -                    gtkpod_statusbar_message (_("Extended information file 
not deleted: '%s\'"), ext);
 -                }
 -            }
 -            g_free (ext);
 -        }
 -      }
 -      if (success)
 -      {   /* copy to cfgdir */
 -        GError *error = NULL;
 -        if (! g_file_test (eitdb->offline_filename, G_FILE_TEST_EXISTS))
 -        {
 -            /* Possible that plugging an ipod into a different pc can lead to 
an offline filename
 -             * that does not exist. This results in the save process failing 
as it cannot write a
 -             * backup. Attempt to mitigate this situation with a reserve 
backup path.
 -             */
 -            gchar *ipod_model = get_itdb_prefs_string (itdb, KEY_IPOD_MODEL);
 -            gchar *backup_name = g_strconcat ("backupDB_", ipod_model, NULL);
 -            g_free (ipod_model);
 -            g_free (eitdb->offline_filename);
 -            eitdb->offline_filename = g_build_filename(cfgdir, backup_name, 
NULL);
 -            g_free (backup_name);
 -            gtkpod_warning ("Backup database could not be found so backing up 
database to %s\n", eitdb->offline_filename);
 -        }
 -
 -        if (!itdb_cp (itdb->filename, eitdb->offline_filename, &error))
 -        {
 -            success = FALSE;
 -            if (error && error->message)
 -                gtkpod_warning ("%s\n\n", error->message);
 -            else
 -                g_warning ("error->message == NULL!\n");
 -            g_error_free (error);
 -            error = NULL;
 -        }
 -        if (WRITE_EXTENDED_INFO)
 -        {
 -            gchar *from, *to;
 -            from = g_strdup_printf ("%s.ext", itdb->filename);
 -            to = g_strdup_printf ("%s.ext", eitdb->offline_filename);
 -            if (!itdb_cp (from, to, &error))
 -            {
 -                success = FALSE;
 -                if (error && error->message)
 -                    gtkpod_warning ("%s\n\n", error->message);
 -                else
 -                    g_warning ("error->message == NULL!\n");
 -                g_error_free (error);
 -            }
 -            g_free (from);
 -            g_free (to);
 -        }
 -      }
 -  }
 -
 -  if (success && get_offline (itdb) &&
 -      (itdb->usertype & GP_ITDB_TYPE_IPOD))
 -  {   /* write to cfgdir */
 -      GError *error = NULL;
 -      if (!itdb_write_file (itdb, eitdb->offline_filename, &error))
 -      {   /* an error occurred */
 -        success = FALSE;
 -        if (error && error->message)
 -            gtkpod_warning ("%s\n\n", error->message);
 -        else
 -            g_warning ("error->message == NULL!\n");
 -        g_error_free (error);
 -        error = NULL;
 -      }
 -      if (success && WRITE_EXTENDED_INFO)
 -      {   /* write extended information */
 -        success = write_extended_info (itdb);
 -      }
 -  }
 -
 -
 -  if (success && (itdb->usertype & GP_ITDB_TYPE_LOCAL))
 -  {   /* write to cfgdir */
 -      GError *error = NULL;
 -      if (!itdb_write_file (itdb, NULL, &error))
 -      {   /* an error occurred */
 -        success = FALSE;
 -        if (error && error->message)
 -            gtkpod_warning ("%s\n\n", error->message);
 -        else
 -            g_warning ("error->message == NULL!\n");
 -        g_error_free (error);
 -        error = NULL;
 -      }
 -      if (success)
 -      {   /* write extended information */
 -        success = write_extended_info (itdb);
 -      }
 -  }
 -
 -  /* If the ipod supports photos and the photo_data_changed
 -   * flag has been set to true then wrtie the photo database
 -   */
 -  if (success &&
 -                (itdb->usertype & GP_ITDB_TYPE_IPOD) &&
 -                itdb_device_supports_photo (itdb->device) &&
 -                eitdb->photodb != NULL &&
 -                eitdb->photo_data_changed == TRUE)
 -  {
 -        GError *error = NULL;
 -        if (!itdb_photodb_write (eitdb->photodb, &error))
 -        {
 -                success = FALSE;
 -                if (error && error->message)
 -                        gtkpod_warning ("%s\n\n", error->message);
 -                else
 -                        g_warning ("error->message == NULL!\n");
 -
 -                g_error_free (error);
 -                error = NULL;
 -        }
 -  }
 -
 -  /* indicate that files and/or database is saved */
 -  if (success)
 -  {
 -      data_unchanged (itdb);
 -      if (itdb->usertype & GP_ITDB_TYPE_IPOD)
 -      {
 -        gtkpod_statusbar_message(_("%s: Database saved"), mpl->name);
 -      }
 -      else
 -      {
 -        gtkpod_statusbar_message(_("%s: Changes saved"), mpl->name);
 -      }
 -  }
 -
 -  g_free (cfgdir);
 -
 -  gtk_widget_destroy (dialog);
 -  transfer_data_free (transferdata);
 -
 -  release_widgets ();
 -
 -  return success;
 -}
 +    cfgdir = prefs_get_cfgdir();
 +    g_return_val_if_fail (cfgdir, FALSE);
 +
 +    mpl = itdb_playlist_mpl(itdb);
 +    g_return_val_if_fail (mpl, FALSE);
 +
 +    if (!eitdb->itdb_imported) { /* No iTunesDB was read but user wants to 
export current
 +     data. If an iTunesDB is present on the iPod or in cfgdir,
 +     this is most likely an error. We should tell the user */
 +        gchar *tunes = NULL;
 +        /* First check if we can find an existing iTunesDB. */
 +        if (itdb->usertype & GP_ITDB_TYPE_LOCAL) {
 +            tunes = g_strdup(itdb->filename);
 +        }
 +        else if (itdb->usertype & GP_ITDB_TYPE_IPOD) {
 +            if (get_offline(itdb)) {
 +                tunes = g_strdup(eitdb->offline_filename);
 +            }
 +            else {
 +                const gchar *mountpoint = itdb_get_mountpoint(itdb);
 +                g_return_val_if_fail (mountpoint, FALSE);
 +                tunes = itdb_get_itunesdb_path(mountpoint);
 +            }
 +        }
 +        else {
 +            g_free(cfgdir);
 +            g_return_val_if_reached (FALSE);
 +        }
 +        if (g_file_test(tunes, G_FILE_TEST_EXISTS)) {
 +            gchar
 +                    *str =
 +                            g_strdup_printf(_("You did not import the 
existing iTunesDB ('%s'). This is most likely incorrect and will result in the 
loss of the existing database.\n\nIf you skip storing, you can import the 
existing database before calling this function again.\n"), tunes);
 +
 +            gint
 +                    result =
 +                            gtkpod_confirmation_hig(GTK_MESSAGE_WARNING, 
_("Existing iTunes database not imported"), str, _("Proceed anyway"), _("Skip 
storing"), NULL, NULL);
 +
 +            g_free(str);
 +
 +            if (result == GTK_RESPONSE_CANCEL) {
 +                g_free(cfgdir);
 +                return FALSE;
 +            }
 +        }
 +    }
  
 +    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)) {
 +        const gchar *mountpoint = itdb_get_mountpoint(itdb);
 +        g_return_val_if_fail (mountpoint, FALSE);
 +        /* check if iPod directories are present */
 +        if (!ipod_dirs_present(mountpoint)) { /* no -- create them */
 +            gtkpod_init_repository(itdb);
 +            /* if still not present abort */
 +            if (!ipod_dirs_present(mountpoint)) {
 +                gtkpod_warning(_("iPod directory structure must be present 
before synching to the iPod can be performed.\n"));
 +                success = FALSE;
 +            }
 +        }
 +        if (success) { /* remove deleted files */
 +            success = delete_files(itdb, transferdata);
 +            if (!success) {
 +                gtkpod_warning(_("Some tracks could not be deleted from the 
iPod. Export aborted!"));
 +            }
 +        }
 +        if (success) {
 +            /* write tracks to iPod */
 +            success = transfer_tracks(itdb, transferdata);
 +        }
 +    }
  
 +    if (itdb->usertype & GP_ITDB_TYPE_LOCAL) {
 +        success = delete_files(itdb, transferdata);
 +    }
 +
 +    if (success) {
 +        gchar *buf;
 +        buf = g_strdup_printf(_("Now writing database '%s'. Please wait..."), 
mpl->name);
 +        gtk_label_set_text(GTK_LABEL (transferdata->textlabel), buf);
 +        g_free(buf);
 +
 +        while (widgets_blocked && gtk_events_pending())
 +            gtk_main_iteration();
 +    }
 +
 +    if (success && !get_offline(itdb) && (itdb->usertype & 
GP_ITDB_TYPE_IPOD)) { /* write to the iPod */
 +        GError *error = NULL;
 +        if (!itdb_write(itdb, &error)) { /* an error occurred */
 +            success = FALSE;
 +            if (error && error->message)
 +                gtkpod_warning("%s\n\n", error->message);
 +            else
 +                g_warning ("error->message == NULL!\n");
 +            g_error_free(error);
 +            error = NULL;
 +        }
 +
 +        if (success) { /* write shuffle data */
 +            if (!itdb_shuffle_write(itdb, &error)) { /* an error occurred */
 +                success = FALSE;
 +                if (error && error->message)
 +                    gtkpod_warning("%s\n\n", error->message);
 +                else
 +                    g_warning ("error->message == NULL!\n");
 +                g_error_free(error);
 +                error = NULL;
 +            }
 +        }
 +        if (success) {
 +            if (WRITE_EXTENDED_INFO) { /* write extended information */
 +                success = write_extended_info(itdb);
 +            }
 +            else { /* delete extended information if present */
 +                gchar *ext = g_strdup_printf("%s.ext", itdb->filename);
 +                if (g_file_test(ext, G_FILE_TEST_EXISTS)) {
 +                    if (remove(ext) != 0) {
 +                        gtkpod_statusbar_message(_("Extended information file 
not deleted: '%s\'"), ext);
 +                    }
 +                }
 +                g_free(ext);
 +            }
 +        }
 +        if (success) { /* copy to cfgdir */
 +            GError *error = NULL;
 +            if (!g_file_test(eitdb->offline_filename, G_FILE_TEST_EXISTS)) {
 +                /* Possible that plugging an ipod into a different pc can 
lead to an offline filename
 +                 * that does not exist. This results in the save process 
failing as it cannot write a
 +                 * backup. Attempt to mitigate this situation with a reserve 
backup path.
 +                 */
 +                gchar *ipod_model = get_itdb_prefs_string(itdb, 
KEY_IPOD_MODEL);
 +                gchar *backup_name = g_strconcat("backupDB_", ipod_model, 
NULL);
 +                g_free(ipod_model);
 +                eitdb->offline_filename = g_build_filename(cfgdir, 
backup_name, NULL);
 +                g_free(backup_name);
 +                gtkpod_warning("Backup database could not be found so backing 
up database to %s\n", eitdb->offline_filename);
 +            }
 +
 +            if (!itdb_cp(itdb->filename, eitdb->offline_filename, &error)) {
 +                success = FALSE;
 +                if (error && error->message)
 +                    gtkpod_warning("%s\n\n", error->message);
 +                else
 +                    g_warning ("error->message == NULL!\n");
 +                g_error_free(error);
 +                error = NULL;
 +            }
 +            if (WRITE_EXTENDED_INFO) {
 +                gchar *from, *to;
 +                from = g_strdup_printf("%s.ext", itdb->filename);
 +                to = g_strdup_printf("%s.ext", eitdb->offline_filename);
 +                if (!itdb_cp(from, to, &error)) {
 +                    success = FALSE;
 +                    if (error && error->message)
 +                        gtkpod_warning("%s\n\n", error->message);
 +                    else
 +                        g_warning ("error->message == NULL!\n");
 +                    g_error_free(error);
 +                }
 +                g_free(from);
 +                g_free(to);
 +            }
 +        }
 +    }
 +
 +    if (success && get_offline(itdb) && (itdb->usertype & GP_ITDB_TYPE_IPOD)) 
{ /* write to cfgdir */
 +        GError *error = NULL;
 +        if (!itdb_write_file(itdb, eitdb->offline_filename, &error)) { /* an 
error occurred */
 +            success = FALSE;
 +            if (error && error->message)
 +                gtkpod_warning("%s\n\n", error->message);
 +            else
 +                g_warning ("error->message == NULL!\n");
 +            g_error_free(error);
 +            error = NULL;
 +        }
 +        if (success && WRITE_EXTENDED_INFO) { /* write extended information */
 +            success = write_extended_info(itdb);
 +        }
 +    }
 +
 +    if (success && (itdb->usertype & GP_ITDB_TYPE_LOCAL)) { /* write to 
cfgdir */
 +        GError *error = NULL;
 +        if (!itdb_write_file(itdb, NULL, &error)) { /* an error occurred */
 +            success = FALSE;
 +            if (error && error->message)
 +                gtkpod_warning("%s\n\n", error->message);
 +            else
 +                g_warning ("error->message == NULL!\n");
 +            g_error_free(error);
 +            error = NULL;
 +        }
 +        if (success) { /* write extended information */
 +            success = write_extended_info(itdb);
 +        }
 +    }
 +
 +    /* If the ipod supports photos and the photo_data_changed
 +     * flag has been set to true then wrtie the photo database
 +     */
 +    if (success && (itdb->usertype & GP_ITDB_TYPE_IPOD) && 
itdb_device_supports_photo(itdb->device) && eitdb->photodb
 +            != NULL && eitdb->photo_data_changed == TRUE) {
 +        GError *error = NULL;
 +        if (!itdb_photodb_write(eitdb->photodb, &error)) {
 +            success = FALSE;
 +            if (error && error->message)
 +                gtkpod_warning("%s\n\n", error->message);
 +            else
 +                g_warning ("error->message == NULL!\n");
 +
 +            g_error_free(error);
 +            error = NULL;
 +        }
 +    }
 +
 +    /* indicate that files and/or database is saved */
-     g_message("TODO indicate that database has been saved\n");
 +    if (success) {
 +        data_unchanged(itdb);
 +        if (itdb->usertype & GP_ITDB_TYPE_IPOD) {
 +            gtkpod_statusbar_message(_("%s: Database saved"), mpl->name);
 +        }
 +        else {
 +            gtkpod_statusbar_message(_("%s: Changes saved"), mpl->name);
 +        }
 +    }
 +
 +    g_free(cfgdir);
 +
 +    gtk_widget_destroy(dialog);
 +    transfer_data_free(transferdata);
 +
 +    release_widgets();
 +
 +    return success;
 +}
  
  /* used to handle export of database */
  /* ATTENTION: directly used as callback in gtkpod.glade -- if you
diff --cc src/mp4file.c
index 08fbbc3,0817085..8f74c3d
--- a/src/mp4file.c
+++ b/src/mp4file.c
@@@ -31,7 -31,10 +31,10 @@@
  #  include <config.h>
  #endif
  
 +#include <glib/gi18n-lib.h>
+ #ifdef HAVE_ENDIAN_H
+ #  include <endian.h> /* for be32toh () */
+ #endif
 -
  #include "charset.h"
  #include "itdb.h"
  #include "misc.h"
@@@ -256,9 -267,18 +267,18 @@@ typedef bool (*MP4GetMetadataTool_t)(MP
  typedef bool (*MP4GetMetadataFreeForm_t)(MP4FileHandle hFile, const char 
*name,
                            u_int8_t** pValue, u_int32_t* valueSize, const char 
*owner DEFAULT(NULL));
  
 -typedef bool (*MP4HaveAtom_t)(MP4FileHandle hFile, 
 +typedef bool (*MP4HaveAtom_t)(MP4FileHandle hFile,
                 const char *atomName);
  
+ typedef bool (*MP4GetIntegerProperty_t)(MP4FileHandle hFile,
+                const char* propName, u_int64_t *retval);
+ typedef bool (*MP4GetStringProperty_t)(MP4FileHandle hFile,
+                const char* propName, const char **retvalue);
+ typedef bool (*MP4GetBytesProperty_t)(MP4FileHandle hFile,
+                const char* propName, u_int8_t** ppValue, u_int32_t* 
pValueSize);
+ typedef bool (*MP4SetVerbosity_t)(MP4FileHandle hFile,
+                u_int32_t verbosity);
+ 
  typedef bool (*MP4SetMetadataName_t)(MP4FileHandle hFile, const char* value);
  typedef bool (*MP4SetMetadataArtist_t)(MP4FileHandle hFile, const char* 
value);
  typedef bool (*MP4SetMetadataAlbumArtist_t)(MP4FileHandle hFile, const char* 
value);
@@@ -337,10 -368,10 +368,10 @@@ static MP4TagsFree_t MP4TagsFreeFunc = 
  /* end mp4v2 dynamic load declarations */
  
  /* mp4v2 initialization code */
 -    
 +
  void mp4_init()
  {
-     mp4v2_handle = dlopen("libmp4v2.so.0", RTLD_LAZY);
+     mp4v2_handle = dlopen("libmp4v2.so.1", RTLD_LAZY);
  
      if (!mp4v2_handle)
      {
@@@ -400,9 -435,12 +435,12 @@@
      MP4SetMetadataCoverArt = (MP4SetMetadataCoverArt_t) dlsym(mp4v2_handle, 
"MP4SetMetadataCoverArt");
      MP4Modify = (MP4Modify_t) dlsym(mp4v2_handle, "MP4Modify");
      MP4MetadataDelete = (MP4MetadataDelete_t) dlsym(mp4v2_handle, 
"MP4MetadataDelete");
+     MP4TagsAllocFunc = (MP4TagsAlloc_t) dlsym(mp4v2_handle, "MP4TagsAlloc");
+     MP4TagsFetchFunc = (MP4TagsFetch_t) dlsym(mp4v2_handle, "MP4TagsFetch");
+     MP4TagsFreeFunc = (MP4TagsFree_t) dlsym(mp4v2_handle, "MP4TagsFree");
  
      /* alternate names for HAVE_LIBMP4V2_2 */
 -    
 +
      if(!MP4GetMetadataWriter)
      {
          MP4GetMetadataWriter = (MP4GetMetadataWriter_t) dlsym(mp4v2_handle, 
"MP4GetMetadataComposer");
@@@ -641,8 -782,13 +782,13 @@@ Track *mp4_get_file_info (gchar *mp4Fil
            {
                gchar *value;
                guint16 numvalue, numvalue2;
+               u_int8_t numvalue3;
+               gboolean possibly_tv_show = FALSE;
+ #if HAVE_MP4V2_ITMF_TAGS_H
+               const MP4Tags* mp4tags = NULL;
+ #endif
                MP4Duration trackDuration = MP4GetTrackDuration(mp4File, 
trackId);
 -              double msDuration = 
 +              double msDuration =
                    (double)MP4ConvertFromTrackDuration(mp4File, trackId,
                                                        trackDuration,
                                                        MP4_MSECS_TIME_SCALE);

------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
gtkpod-cvs2 mailing list
gtkpod-cvs2@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2

Reply via email to