Update of /cvsroot/gtkpod/gtkpod/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8456/src
Modified Files: context_menus.c details.c details.h display_itdb.c display_itdb.h display_songs.c file_itunesdb.c misc_conversion.c misc_track.c misc_track.h Log Message: * details.c: apply/undo functionality * file_itunesdb.c: save thumbnail filename in .ext database * misc_track.c: new: track_set_text() * misc_conversion.c: recognize "--" as unset time * display_songs.c: use track_set_text(), track_copy_item() Index: context_menus.c =================================================================== RCS file: /cvsroot/gtkpod/gtkpod/src/context_menus.c,v retrieving revision 1.50 retrieving revision 1.51 diff -u -d -r1.50 -r1.51 --- context_menus.c 28 Nov 2005 16:25:34 -0000 1.50 +++ context_menus.c 3 Dec 2005 16:36:26 -0000 1.51 @@ -1,4 +1,4 @@ -/* Time-stamp: <2005-11-27 16:37:21 jcs> +/* Time-stamp: <2005-12-04 00:38:28 jcs> | | Copyright (C) 2003 Corey Donohoe <atmos at atmos dot org> | Copyright (C) 2003-2005 Jorg Schuler <jcsjcs at users sourceforge net> @@ -168,14 +168,14 @@ * @data - Ignored, should be NULL */ static void -show_details_entries(GtkMenuItem *mi, gpointer data) +edit_details_entries(GtkMenuItem *mi, gpointer data) { if (selected_playlist) - details_show (selected_playlist->members); + details_edit (selected_playlist->members); else if(selected_entry) - details_show (selected_entry->members); + details_edit (selected_entry->members); else if(selected_tracks) - details_show (selected_tracks); + details_edit (selected_tracks); } /* @@ -373,8 +373,8 @@ G_CALLBACK (export_entries), NULL); hookup_mi (menu[type], _("Create Playlist File"), GTK_STOCK_FLOPPY, G_CALLBACK (create_playlist_file), NULL); - hookup_mi (menu[type], _("Show Details"), NULL, - G_CALLBACK (show_details_entries), NULL); + hookup_mi (menu[type], _("Edit Details"), NULL, + G_CALLBACK (edit_details_entries), NULL); hookup_mi (menu[type], _("Update"), GTK_STOCK_REFRESH, G_CALLBACK (update_entries), NULL); hookup_mi (menu[type], _("Sync Dirs"), GTK_STOCK_REFRESH, Index: details.c =================================================================== RCS file: /cvsroot/gtkpod/gtkpod/src/details.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- details.c 28 Nov 2005 16:25:34 -0000 1.3 +++ details.c 3 Dec 2005 16:36:26 -0000 1.4 @@ -1,4 +1,4 @@ -/* Time-stamp: <2005-11-29 00:56:25 jcs> +/* Time-stamp: <2005-12-04 01:10:10 jcs> | | Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net> | Part of the gtkpod project. @@ -36,6 +36,7 @@ #include "misc.h" #include "misc_track.h" #include "prefs.h" +#include <string.h> [...988 lines suppressed...] + page = prefs_get_int (DETAILS_WINDOW_NOTEBOOK_PAGE); + if ((page >= 0) && (page < 3)) + gtk_notebook_set_current_page (GTK_NOTEBOOK (w), page); /* set default size */ defx = prefs_get_int (DETAILS_WINDOW_DEFX); @@ -678,6 +1217,13 @@ if (detail->tracks) { + GList *gl; + for (gl=detail->tracks; gl; gl=gl->next) + { + Track *tr = gl->data; + g_return_if_fail (tr); + itdb_track_free (tr); + } g_list_free (detail->tracks); } Index: details.h =================================================================== RCS file: /cvsroot/gtkpod/gtkpod/src/details.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- details.h 23 Nov 2005 04:16:12 -0000 1.1 +++ details.h 3 Dec 2005 16:36:26 -0000 1.2 @@ -1,4 +1,4 @@ -/* Time-stamp: <2005-11-20 20:53:39 jcs> +/* Time-stamp: <2005-12-04 00:38:09 jcs> | | Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net> | Part of the gtkpod project. @@ -38,7 +38,7 @@ #include "itdb.h" /* details window */ -void details_show (GList *selected_tracks); +void details_edit (GList *selected_tracks); void details_close (void); void details_update_default_sizes (void); void details_update_track (Track *track); Index: display_itdb.c =================================================================== RCS file: /cvsroot/gtkpod/gtkpod/src/display_itdb.c,v retrieving revision 1.36 retrieving revision 1.37 diff -u -d -r1.36 -r1.37 --- display_itdb.c 23 Nov 2005 04:16:12 -0000 1.36 +++ display_itdb.c 3 Dec 2005 16:36:26 -0000 1.37 @@ -1,4 +1,4 @@ -/* Time-stamp: <2005-11-19 22:52:27 jcs> +/* Time-stamp: <2005-12-03 02:10:13 jcs> | | Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net> | Part of the gtkpod project. @@ -34,6 +34,7 @@ #include <math.h> #include <string.h> +#include "charset.h" #include "display_itdb.h" #include "display.h" #include "md5.h" @@ -113,6 +114,8 @@ etr_dup->year_str = g_strdup (etr->year_str); etr_dup->pc_path_locale = g_strdup (etr->pc_path_locale); etr_dup->pc_path_utf8 = g_strdup (etr->pc_path_utf8); + etr_dup->thumb_path_locale = g_strdup (etr->thumb_path_locale); + etr_dup->thumb_path_utf8 = g_strdup (etr->thumb_path_utf8); etr_dup->hostname = g_strdup (etr->hostname); etr_dup->md5_hash = g_strdup (etr->md5_hash); etr_dup->charset = g_strdup (etr->charset); @@ -259,6 +262,54 @@ return result; } + +/* Set a thumbnail and store the filename in ExtraTrackData */ +gboolean gp_track_set_thumbnails (Track *track, const gchar *filename) +{ + gboolean result; + ExtraTrackData *etr; + + g_return_val_if_fail (track, FALSE); + g_return_val_if_fail (filename, FALSE); + + etr = track->userdata; + g_return_val_if_fail (etr, FALSE); + + result = itdb_track_set_thumbnails (track, filename); + if (result == TRUE) + { + g_free (etr->thumb_path_locale); + g_free (etr->thumb_path_utf8); + etr->thumb_path_locale = g_strdup (filename); + etr->thumb_path_utf8 = charset_to_utf8 (filename); + } + else + { + g_free (etr->thumb_path_locale); + g_free (etr->thumb_path_utf8); + etr->thumb_path_locale = g_strdup (""); + etr->thumb_path_utf8 = g_strdup (""); + gtkpod_warning (_("Failed to set cover art: '%s'"), filename); + } + return result; +} + +/* Remove a thumbnail and remove the filename in ExtraTrackData */ +void gp_track_remove_thumbnails (Track *track) +{ + ExtraTrackData *etr; + g_return_if_fail (track); + etr = track->userdata; + g_return_if_fail (etr); + + itdb_track_remove_thumbnails (track); + g_free (etr->thumb_path_locale); + g_free (etr->thumb_path_utf8); + etr->thumb_path_locale = g_strdup (""); + etr->thumb_path_utf8 = g_strdup (""); +} + + /* add itdb to itdbs */ void gp_itdb_add (iTunesDB *itdb, gint pos) { @@ -642,6 +693,8 @@ if (!track->ipod_path) track->ipod_path = g_strdup (""); if (!etr->pc_path_utf8) etr->pc_path_utf8 = g_strdup (""); if (!etr->pc_path_locale) etr->pc_path_locale = g_strdup (""); + if (!etr->thumb_path_utf8) etr->thumb_path_utf8 = g_strdup (""); + if (!etr->thumb_path_locale) etr->thumb_path_locale = g_strdup (""); /* Make sure year_str is identical to year */ g_free (etr->year_str); etr->year_str = g_strdup_printf ("%d", track->year); Index: display_itdb.h =================================================================== RCS file: /cvsroot/gtkpod/gtkpod/src/display_itdb.h,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- display_itdb.h 24 Oct 2005 14:58:02 -0000 1.21 +++ display_itdb.h 3 Dec 2005 16:36:26 -0000 1.22 @@ -1,4 +1,4 @@ -/* Time-stamp: <2005-10-24 23:49:22 jcs> +/* Time-stamp: <2005-12-03 17:39:09 jcs> | | Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net> | Part of the gtkpod project. @@ -73,10 +73,13 @@ gboolean audiophile_gain_set;/* has the audiophile gain been set? */ gchar *pc_path_locale;/* path on PC (local encoding) */ gchar *pc_path_utf8; /* PC filename in utf8 encoding */ + gchar *thumb_path_locale; /* same for thumbnail */ + gchar *thumb_path_utf8; /* same for thumbnail */ gchar *hostname; /* name of host this file has been imported on*/ gchar *md5_hash; /* md5 hash of file (or NULL) */ gchar *charset; /* charset used for ID3 tags */ gint32 sortindex; /* used for stable sorting (current order) */ + gboolean tchanged; /* temporary use, e.g. in detail.c */ } ExtraTrackData; /* types for iTunesDB */ @@ -122,6 +125,8 @@ Track *gp_track_add (iTunesDB *itdb, Track *track); void gp_track_add_extra (Track *track); void gp_track_validate_entries (Track *track); +gboolean gp_track_set_thumbnails (Track *track, const gchar *filename); +void gp_track_remove_thumbnails (Track *track); Playlist *gp_playlist_new (const gchar *title, gboolean spl); void gp_playlist_add (iTunesDB *itdb, Playlist *pl, gint32 pos); Index: display_songs.c =================================================================== RCS file: /cvsroot/gtkpod/gtkpod/src/display_songs.c,v retrieving revision 1.93 retrieving revision 1.94 diff -u -d -r1.93 -r1.94 --- display_songs.c 26 Nov 2005 13:44:41 -0000 1.93 +++ display_songs.c 3 Dec 2005 16:36:26 -0000 1.94 @@ -1,4 +1,4 @@ -/* Time-stamp: <2005-11-25 23:52:14 jcs> +/* Time-stamp: <2005-12-03 20:53:34 jcs> | | Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net> | Part of the gtkpod project. @@ -792,7 +792,6 @@ gboolean multi_edit; gint sel_rows_num; GList *row_list, *row_node, *first; - time_t t; column = (TM_item) g_object_get_data(G_OBJECT(renderer), "column"); @@ -819,8 +818,7 @@ ExtraTrackData *etr; gboolean changed; GtkTreeIter iter; - gint32 nr; - gchar **itemp_utf8, *str; + gchar *str; gtk_tree_model_get_iter(model, &iter, (GtkTreePath *) row_node->data); gtk_tree_model_get(model, &iter, READOUT_COL, &track, -1); @@ -846,134 +844,41 @@ case TM_COLUMN_PODCASTURL: case TM_COLUMN_PODCASTRSS: case TM_COLUMN_SUBTITLE: - itemp_utf8 = track_get_item_pointer (track, TM_to_T (column)); - if (g_utf8_collate (*itemp_utf8, new_text) != 0) - { - g_free (*itemp_utf8); - *itemp_utf8 = g_strdup (new_text); - changed = TRUE; - } - break; case TM_COLUMN_TRACK_NR: - nr = atoi (new_text); - if ((nr >= 0) && (nr != track->track_nr)) - { - track->track_nr = nr; - changed = TRUE; - } - str = strrchr (new_text, '/'); - if (str) - { - nr = atoi (str+1); - if ((nr >= 0) && (nr != track->tracks)) - { - track->tracks = nr; - changed = TRUE; - } - } - str = track_get_text (track, T_CD_NR); - g_object_set (G_OBJECT (renderer), "text", str, NULL); - g_free (str); - break; + case TM_COLUMN_TRACKLEN: case TM_COLUMN_CD_NR: - nr = atoi (new_text); - if ((nr >= 0) && (nr != track->cd_nr)) - { - track->cd_nr = nr; - changed = TRUE; - } - str = strrchr (new_text, '/'); - if (str) - { - nr = atoi (str+1); - if ((nr >= 0) && (nr != track->cds)) - { - track->cds = nr; - changed = TRUE; - } - } - str = track_get_text (track, T_TRACK_NR); - g_object_set (G_OBJECT (renderer), "text", str, NULL); - g_free (str); - break; case TM_COLUMN_YEAR: - nr = atoi (new_text); - if ((nr >= 0) && (nr != track->year)) - { - g_free (etr->year_str); - etr->year_str = g_strdup_printf ("%d", nr); - track->year = nr; - changed = TRUE; - } - break; case TM_COLUMN_PLAYCOUNT: - nr = atoi (new_text); - if ((nr >= 0) && (nr != track->playcount)) - { - track->playcount = nr; - changed = TRUE; - } - break; case TM_COLUMN_RATING: - nr = atoi (new_text); - if ((nr >= 0) && (nr <= 5) && (nr != track->rating)) - { - track->rating = nr*ITDB_RATING_STEP; - changed = TRUE; - } - break; case TM_COLUMN_TIME_ADDED: case TM_COLUMN_TIME_PLAYED: case TM_COLUMN_TIME_MODIFIED: case TM_COLUMN_TIME_RELEASED: - t = time_string_to_time (new_text); - if ((t != -1) && (t != time_get_time (track, TM_to_T (column)))) - { - time_set_time (track, t, TM_to_T (column)); - changed = TRUE; - } - break; case TM_COLUMN_VOLUME: - nr = atoi (new_text); - if (nr != track->volume) - { - track->volume = nr; - changed = TRUE; - } - break; case TM_COLUMN_SOUNDCHECK: - nr = replaygain_to_soundcheck (atof (new_text)); -/* printf("%d : %f\n", nr, atof (new_text)); */ - if (nr != track->soundcheck) - { - track->soundcheck = nr; - changed = TRUE; - } - break; case TM_COLUMN_BITRATE: - nr = atoi (new_text); - if (nr != track->bitrate) - { - track->bitrate = nr; - changed = TRUE; - } - break; case TM_COLUMN_SAMPLERATE: - nr = atoi (new_text); - if (nr != track->samplerate) - { - track->samplerate = nr; - changed = TRUE; - } - break; case TM_COLUMN_BPM: - nr = atoi (new_text); - if (nr != track->BPM) - { - track->BPM = nr; - changed = TRUE; - } - break; + changed = track_set_text (track, new_text, TM_to_T (column)); + + /* redisplay some items to be on the safe side */ + switch (column) + { + case TM_COLUMN_TRACK_NR: + case TM_COLUMN_CD_NR: + case TM_COLUMN_TRACKLEN: + case TM_COLUMN_TIME_ADDED: + case TM_COLUMN_TIME_PLAYED: + case TM_COLUMN_TIME_MODIFIED: + case TM_COLUMN_TIME_RELEASED: + str = track_get_text (track, TM_to_T (column)); + g_object_set (G_OBJECT (renderer), "text", str, NULL); + g_free (str); + break; + default: + break; + } + break; default: g_warning ("Programming error: tm_cell_edited: unknown track cell (%d) edited\n", column); break; @@ -1071,6 +976,7 @@ case TM_COLUMN_RATING: case TM_COLUMN_VOLUME: case TM_COLUMN_SOUNDCHECK: + case TM_COLUMN_TRACKLEN: g_object_set (G_OBJECT (renderer), "text", text, "editable", TRUE, @@ -1078,7 +984,6 @@ break; case TM_COLUMN_IPOD_ID: case TM_COLUMN_SIZE: - case TM_COLUMN_TRACKLEN: g_object_set (G_OBJECT (renderer), "text", text, "editable", FALSE, @@ -1138,7 +1043,7 @@ first = g_list_first (row_list); - + /* active will show the old state -- before the toggle */ g_object_get (G_OBJECT (renderer), "active", &active, NULL); for (row_node = first; @@ -1933,21 +1838,20 @@ /* Add one column at position @pos. This code is used over and over by tm_add_column() -- therefore I put it into a separate function */ static GtkTreeViewColumn *tm_add_text_column (TM_item col_id, - gchar *name, + const gchar *name, GtkCellRenderer *renderer, - gboolean editable, gint pos) { GtkTreeViewColumn *column; GtkTreeModel *model = gtk_tree_view_get_model (track_treeview); - if (!renderer) renderer = gtk_cell_renderer_text_new (); - if (editable) - { + if (!renderer) + { /* text renderer -- editable/not editable is done in + tm_cell_data_func() */ + renderer = gtk_cell_renderer_text_new (); g_signal_connect (G_OBJECT (renderer), "edited", G_CALLBACK (tm_cell_edited), model); } - g_object_set_data (G_OBJECT (renderer), "editable", (gint *)GINT_TO_POINTER(editable)); g_object_set_data (G_OBJECT (renderer), "column", (gint *)col_id); column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, name); @@ -1975,8 +1879,7 @@ { GtkTreeModel *model = gtk_tree_view_get_model (track_treeview); GtkTreeViewColumn *col = NULL; - gchar *text = NULL; - gboolean editable = TRUE; /* default */ + const gchar *text = NULL; GtkCellRenderer *renderer = NULL; /* default */ GtkTooltips *tt; @@ -2009,6 +1912,9 @@ case TM_COLUMN_PODCASTURL: case TM_COLUMN_PODCASTRSS: case TM_COLUMN_SUBTITLE: + case TM_COLUMN_PC_PATH: + case TM_COLUMN_IPOD_PATH: + case TM_COLUMN_SIZE: break; /* for some column names we want to use shorter alternatives to get_tm_string() */ @@ -2023,28 +1929,17 @@ break; case TM_COLUMN_IPOD_ID: text = _("ID"); - editable = FALSE; - break; - case TM_COLUMN_PC_PATH: - case TM_COLUMN_IPOD_PATH: - editable = FALSE; break; case TM_COLUMN_TRANSFERRED: text = _("Trnsfrd"); - editable = FALSE; renderer = gtk_cell_renderer_toggle_new (); break; case TM_COLUMN_COMPILATION: text = _("Cmpl"); - editable = FALSE; renderer = gtk_cell_renderer_toggle_new (); break; - case TM_COLUMN_SIZE: - editable = FALSE; - break; case TM_COLUMN_TRACKLEN: text = _("Time"); - editable = FALSE; break; case TM_COLUMN_PLAYCOUNT: text = _("Plycnt"); @@ -2071,9 +1966,10 @@ text = _("Sndchk."); break; case TM_NUM_COLUMNS: + g_return_val_if_reached (NULL); break; } - col = tm_add_text_column (tm_item, text, renderer, editable, pos); + col = tm_add_text_column (tm_item, text, renderer, pos); if (col && (tm_item == TM_COLUMN_TITLE)) { renderer = gtk_cell_renderer_toggle_new (); Index: file_itunesdb.c =================================================================== RCS file: /cvsroot/gtkpod/gtkpod/src/file_itunesdb.c,v retrieving revision 1.70 retrieving revision 1.71 diff -u -d -r1.70 -r1.71 --- file_itunesdb.c 19 Nov 2005 07:29:46 -0000 1.70 +++ file_itunesdb.c 3 Dec 2005 16:36:26 -0000 1.71 @@ -1,4 +1,4 @@ -/* Time-stamp: <2005-11-19 16:27:44 jcs> +/* Time-stamp: <2005-12-03 02:08:19 jcs> | | Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net> | Part of the gtkpod project. @@ -57,6 +57,8 @@ guint ipod_id; gchar *pc_path_locale; gchar *pc_path_utf8; + gchar *thumb_path_locale; + gchar *thumb_path_utf8; gchar *md5_hash; gchar *charset; gchar *hostname; @@ -133,6 +135,10 @@ etr->pc_path_locale = g_strdup (sei->pc_path_locale); if (sei->pc_path_utf8 && !etr->pc_path_utf8) etr->pc_path_utf8 = g_strdup (sei->pc_path_utf8); + if (sei->thumb_path_locale && !etr->thumb_path_locale) + etr->thumb_path_locale = g_strdup (sei->thumb_path_locale); + if (sei->thumb_path_utf8 && !etr->thumb_path_utf8) + etr->thumb_path_utf8 = g_strdup (sei->thumb_path_utf8); if (sei->md5_hash && !etr->md5_hash) etr->md5_hash = g_strdup (sei->md5_hash); if (sei->charset && !etr->charset) @@ -181,12 +187,14 @@ if (sei) { - C_FREE (sei->pc_path_locale); - C_FREE (sei->pc_path_utf8); - C_FREE (sei->md5_hash); - C_FREE (sei->charset); - C_FREE (sei->hostname); - C_FREE (sei->ipod_path); + g_free (sei->pc_path_locale); + g_free (sei->pc_path_utf8); + g_free (sei->thumb_path_locale); + g_free (sei->thumb_path_utf8); + g_free (sei->md5_hash); + g_free (sei->charset); + g_free (sei->hostname); + g_free (sei->ipod_path); g_free (sei); } } @@ -351,6 +359,10 @@ sei->pc_path_locale = g_strdup (arg); else if (g_ascii_strcasecmp (line, "filename_utf8") == 0) sei->pc_path_utf8 = g_strdup (arg); + else if (g_ascii_strcasecmp (line, "thumbnail_locale") == 0) + sei->thumb_path_locale = g_strdup (arg); + else if (g_ascii_strcasecmp (line, "thumbnail_utf8") == 0) + sei->thumb_path_utf8 = g_strdup (arg); else if (g_ascii_strcasecmp (line, "md5_hash") == 0) { /* only accept hash value if version is >= 0.53 or PATH_MAX is 4096 -- in 0.53 I changed the MD5 hash @@ -574,7 +586,10 @@ for (gl=itdb->tracks; gl; gl=gl->next) { Track *track = gl->data; + ExtraTrackData *etr; g_return_val_if_fail (track, (release_widgets(), NULL)); + etr = track->userdata; + g_return_val_if_fail (etr, (release_widgets(), NULL)); fill_in_extended_info (track, total, num); gp_track_validate_entries (track); /* set new default value for flag1 (unknown) */ @@ -583,6 +598,17 @@ /* set unk208 to audio if unset (important only for iPod Video) */ if (track->unk208 == 0) track->unk208 = 0x00000001; + /* restore deleted thumbnails */ + if ((track->artwork->thumbnails == NULL) && + (strlen (etr->thumb_path_locale) != 0)) + { + /* !! gp_track_set_thumbnails() writes on + etr->thumb_path_locale, so we need to g_strdup() + first !! */ + gchar *filename = g_strdup (etr->thumb_path_locale); + gp_track_set_thumbnails (track, filename); + g_free (filename); + } ++num; } /* take over the pending deletion information */ @@ -891,17 +917,19 @@ fprintf (fp, "id=%d\n", track->id); if (etr->hostname) fprintf (fp, "hostname=%s\n", etr->hostname); - if (strlen (etr->pc_path_locale) != 0) + if (etr->pc_path_locale && *etr->pc_path_locale) fprintf (fp, "filename_locale=%s\n", etr->pc_path_locale); - if (strlen (etr->pc_path_utf8) != 0) - fprintf (fp, "filename_utf8=%s\n", etr->pc_path_utf8); + if (etr->pc_path_utf8 && *etr->pc_path_utf8) + fprintf (fp, "thumbnail_utf8=%s\n", etr->pc_path_utf8); + if (etr->thumb_path_locale && *etr->thumb_path_locale) + fprintf (fp, "thumbnail_locale=%s\n", etr->thumb_path_locale); + if (etr->thumb_path_utf8 && *etr->thumb_path_utf8) + fprintf (fp, "filename_utf8=%s\n", etr->thumb_path_utf8); /* this is just for convenience for people looking for a track on the ipod away from gktpod/itunes etc. */ - if (strlen (track->ipod_path) != 0) - fprintf (fp, "filename_ipod=%s\n", track->ipod_path); - if (etr->md5_hash) + if (etr->md5_hash && *etr->md5_hash) fprintf (fp, "md5_hash=%s\n", etr->md5_hash); - if (etr->charset) + if (etr->charset && *etr->charset) fprintf (fp, "charset=%s\n", etr->charset); if (!track->transferred && etr->oldsize) fprintf (fp, "oldsize=%d\n", etr->oldsize); Index: misc_conversion.c =================================================================== RCS file: /cvsroot/gtkpod/gtkpod/src/misc_conversion.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- misc_conversion.c 25 Nov 2005 00:16:34 -0000 1.24 +++ misc_conversion.c 3 Dec 2005 16:36:26 -0000 1.25 @@ -1,4 +1,4 @@ -/* Time-stamp: <2005-11-25 09:13:15 jcs> +/* Time-stamp: <2005-12-03 20:39:08 jcs> | | Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net> | Part of the gtkpod project. @@ -343,7 +343,7 @@ /* convert the string @str to a time stamp, assuming 0:00:00 if no - * time is given */ + * time is given. Returns 0 if @str is "--" */ time_t time_string_to_fromtime (const gchar *str) { time_t t; @@ -351,6 +351,8 @@ g_return_val_if_fail (str, -1); + if (strcmp (str, "--") == 0) return 0; + t = time (NULL); localtime_r (&t, &tm); tm.tm_sec = 0; Index: misc_track.c =================================================================== RCS file: /cvsroot/gtkpod/gtkpod/src/misc_track.c,v retrieving revision 1.31 retrieving revision 1.32 diff -u -d -r1.31 -r1.32 --- misc_track.c 23 Nov 2005 04:16:12 -0000 1.31 +++ misc_track.c 3 Dec 2005 16:36:26 -0000 1.32 @@ -1,4 +1,4 @@ -/* Time-stamp: <2005-11-21 20:52:10 jcs> +/* Time-stamp: <2005-12-04 00:30:49 jcs> | | Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net> | Part of the gtkpod project. @@ -39,6 +39,7 @@ #include "info.h" #include "charset.h" #include <math.h> +#include <stdlib.h> #include <string.h> @@ -542,6 +543,11 @@ } + + + + + /* return the UTF8 item @t_item. @t_item is one of (the applicable) T_* defined in track.h */ const gchar *track_get_item (Track *track, T_item t_item) @@ -557,6 +563,187 @@ } +/* Copy item @item from @frtrack to @totrack. + Return value: + TRUE: @totrack was changed + FALSE: @totrack is unchanged +*/ +gboolean track_copy_item (Track *frtrack, Track *totrack, T_item item) +{ + gboolean changed = FALSE; + const gchar *fritem; + gchar **toitem_ptr; + + g_return_val_if_fail (frtrack, FALSE); + g_return_val_if_fail (totrack, FALSE); + g_return_val_if_fail ((item > 0) && (item < T_ITEM_NUM), FALSE); + + if (frtrack == totrack) return FALSE; + + switch (item) + { + case T_ALBUM: + case T_ARTIST: + case T_TITLE: + case T_GENRE: + case T_COMMENT: + case T_COMPOSER: + case T_FILETYPE: + case T_IPOD_PATH: + case T_PC_PATH: + case T_YEAR: + case T_GROUPING: + case T_CATEGORY: + case T_DESCRIPTION: + case T_PODCASTURL: + case T_PODCASTRSS: + case T_SUBTITLE: + fritem = track_get_item (frtrack, item); + toitem_ptr = track_get_item_pointer (totrack, item); + g_return_val_if_fail (fritem, FALSE); + g_return_val_if_fail (toitem_ptr, FALSE); + if ((*toitem_ptr == NULL) || (strcmp (fritem, *toitem_ptr) != 0)) + { + g_free (*toitem_ptr); + *toitem_ptr = g_strdup (fritem); + changed = TRUE; + } + break; + case T_IPOD_ID: + if (frtrack->id != totrack->id) + { + totrack->id = frtrack->id; + changed = TRUE; + } + break; + case T_TRACK_NR: + if (frtrack->track_nr != totrack->track_nr) + { + totrack->track_nr = frtrack->track_nr; + changed = TRUE; + } + if (frtrack->tracks != totrack->tracks) + { + totrack->tracks = frtrack->tracks; + changed = TRUE; + } + break; + case T_TRANSFERRED: + if (frtrack->transferred != totrack->transferred) + { + totrack->transferred = frtrack->transferred; + changed = TRUE; + } + break; + case T_SIZE: + if (frtrack->size != totrack->size) + { + totrack->size = frtrack->size; + changed = TRUE; + } + break; + case T_TRACKLEN: + if (frtrack->tracklen != totrack->tracklen) + { + totrack->tracklen = frtrack->tracklen; + changed = TRUE; + } + break; + case T_BITRATE: + if (frtrack->bitrate != totrack->bitrate) + { + totrack->bitrate = frtrack->bitrate; + changed = TRUE; + } + break; + case T_SAMPLERATE: + if (frtrack->samplerate != totrack->samplerate) + { + totrack->samplerate = frtrack->samplerate; + changed = TRUE; + } + break; + case T_BPM: + if (frtrack->BPM != totrack->BPM) + { + totrack->BPM = frtrack->BPM; + changed = TRUE; + } + break; + case T_PLAYCOUNT: + if (frtrack->playcount != totrack->playcount) + { + totrack->playcount = frtrack->playcount; + changed = TRUE; + } + break; + case T_RATING: + if (frtrack->rating != totrack->rating) + { + totrack->rating = frtrack->rating; + changed = TRUE; + } + break; + case T_TIME_ADDED: + case T_TIME_PLAYED: + case T_TIME_MODIFIED: + case T_TIME_RELEASED: + if (time_get_time (frtrack, item) != + time_get_time (totrack, item)) + { + time_set_time (totrack, time_get_time (frtrack, item), item); + changed = TRUE; + } + break; + case T_VOLUME: + if (frtrack->volume != totrack->volume) + { + totrack->volume = frtrack->volume; + changed = TRUE; + } + break; + case T_SOUNDCHECK: + if (frtrack->soundcheck != totrack->soundcheck) + { + totrack->soundcheck = frtrack->soundcheck; + changed = TRUE; + } + break; + case T_CD_NR: + if (frtrack->cd_nr != totrack->cd_nr) + { + totrack->cd_nr = frtrack->cd_nr; + changed = TRUE; + } + if (frtrack->cds != totrack->cds) + { + totrack->cds = frtrack->cds; + changed = TRUE; + } + break; + case T_COMPILATION: + if (frtrack->compilation != totrack->compilation) + { + totrack->compilation = frtrack->compilation; + changed = TRUE; + } + break; + case T_CHECKED: + if (frtrack->checked != totrack->checked) + { + totrack->checked = frtrack->checked; + changed = TRUE; + } + break; + case T_ITEM_NUM: + case T_ALL: + g_return_val_if_reached (FALSE); + + } + return changed; +} + + /* return a pointer to the specified timestamp. @t_item is one of (the applicable) T_* defined in track.h. If the parameters are illegal, "0" is returned. */ @@ -706,6 +893,206 @@ } + +/* Set track data according to @new_text + + Return value: TRUE, if the track data was modified, FALSE otherwise +*/ +gboolean track_set_text (Track *track, const gchar *new_text, T_item item) +{ + gboolean changed = FALSE; + gchar **itemp_utf8; + const gchar *str; + ExtraTrackData *etr; + gint32 nr; + time_t t; + + g_return_val_if_fail (track, FALSE); + g_return_val_if_fail (new_text, FALSE); + + etr = track->userdata; + g_return_val_if_fail (etr, FALSE); + + + switch(item) + { + case T_TITLE: + case T_ALBUM: + case T_ARTIST: + case T_GENRE: + case T_COMPOSER: + case T_COMMENT: + case T_FILETYPE: + case T_GROUPING: + case T_CATEGORY: + case T_DESCRIPTION: + case T_PODCASTURL: + case T_PODCASTRSS: + case T_SUBTITLE: + itemp_utf8 = track_get_item_pointer (track, item); + if (g_utf8_collate (*itemp_utf8, new_text) != 0) + { + g_free (*itemp_utf8); + *itemp_utf8 = g_strdup (new_text); + changed = TRUE; + } + break; + case T_TRACK_NR: + nr = atoi (new_text); + if ((nr >= 0) && (nr != track->track_nr)) + { + track->track_nr = nr; + changed = TRUE; + } + str = strrchr (new_text, '/'); + if (str) + { + nr = atoi (str+1); + if ((nr >= 0) && (nr != track->tracks)) + { + track->tracks = nr; + changed = TRUE; + } + } + break; + case T_CD_NR: + nr = atoi (new_text); + if ((nr >= 0) && (nr != track->cd_nr)) + { + track->cd_nr = nr; + changed = TRUE; + } + str = strrchr (new_text, '/'); + if (str) + { + nr = atoi (str+1); + if ((nr >= 0) && (nr != track->cds)) + { + track->cds = nr; + changed = TRUE; + } + } + break; + case T_YEAR: + nr = atoi (new_text); + if ((nr >= 0) && (nr != track->year)) + { + g_free (etr->year_str); + etr->year_str = g_strdup_printf ("%d", nr); + track->year = nr; + changed = TRUE; + } + break; + case T_PLAYCOUNT: + nr = atoi (new_text); + if ((nr >= 0) && (nr != track->playcount)) + { + track->playcount = nr; + changed = TRUE; + } + break; + case T_RATING: + nr = atoi (new_text); + if ((nr >= 0) && (nr <= 5) && (nr != track->rating)) + { + track->rating = nr*ITDB_RATING_STEP; + changed = TRUE; + } + break; + case T_TIME_ADDED: + case T_TIME_PLAYED: + case T_TIME_MODIFIED: + case T_TIME_RELEASED: + t = time_string_to_time (new_text); + if ((t != -1) && (t != time_get_time (track, item))) + { + time_set_time (track, t, item); + changed = TRUE; + } + break; + case T_VOLUME: + nr = atoi (new_text); + if (nr != track->volume) + { + track->volume = nr; + changed = TRUE; + } + break; + case T_SOUNDCHECK: + nr = replaygain_to_soundcheck (atof (new_text)); +/* printf("%d : %f\n", nr, atof (new_text)); */ + if (nr != track->soundcheck) + { + track->soundcheck = nr; + changed = TRUE; + } + break; + case T_SIZE: + nr = atoi (new_text); + if (nr != track->size) + { + track->size = nr; + changed = TRUE; + } + break; + case T_BITRATE: + nr = atoi (new_text); + if (nr != track->bitrate) + { + track->bitrate = nr; + changed = TRUE; + } + break; + case T_SAMPLERATE: + nr = atoi (new_text); + if (nr != track->samplerate) + { + track->samplerate = nr; + changed = TRUE; + } + break; + case T_BPM: + nr = atoi (new_text); + if (nr != track->BPM) + { + track->BPM = nr; + changed = TRUE; + } + break; + case T_TRACKLEN: + str = strrchr (new_text, ':'); + if (str) + { /* MM:SS */ + nr = 1000 * (60 * atoi (new_text) + atoi (str+1)); + } + else + { /* SS */ + nr = 1000 * atoi (new_text); + } + if (nr != track->tracklen) + { + track->tracklen = nr; + changed = TRUE; + } + break; + case T_PC_PATH: + case T_IPOD_PATH: + case T_IPOD_ID: + case T_TRANSFERRED: + case T_COMPILATION: + case T_CHECKED: + case T_ALL: + case T_ITEM_NUM: + gtkpod_warning ("Programming error: track_set_text() called with illegal argument (item: %d)\n", item); + break; + } + + return changed; +} + + + + /* Fills @size with the size and @num with the number of non-transferred tracks. The size is in Bytes, minus the space taken by tracks that will be overwritten. */ Index: misc_track.h =================================================================== RCS file: /cvsroot/gtkpod/gtkpod/src/misc_track.h,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- misc_track.h 23 Nov 2005 04:16:12 -0000 1.13 +++ misc_track.h 3 Dec 2005 16:36:26 -0000 1.14 @@ -1,4 +1,4 @@ -/* Time-stamp: <2005-11-21 00:18:29 jcs> +/* Time-stamp: <2005-12-03 20:08:42 jcs> | | Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net> | Part of the gtkpod project. @@ -44,6 +44,9 @@ guint32 *track_get_timestamp_ptr (Track *track, T_item t_item); guint32 track_get_timestamp (Track *track, T_item t_item); gchar *track_get_text (Track *track, T_item item); +gboolean track_set_text (Track *track, + const gchar *new_text, T_item item); +gboolean track_copy_item (Track *frtrack, Track *totrack, T_item item); void gp_info_nontransferred_tracks (iTunesDB *itdb, gdouble *size, guint32 *num); ------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Do you grep through log files for problems? Stop! Download the new AJAX search engine that makes searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click _______________________________________________ gtkpod-cvs2 mailing list gtkpod-cvs2@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2