commit f67db4d199ee46afd74f30165a8179c03bb35016
Author: phantomjinx <[email protected]>
Date: Tue Mar 15 20:49:22 2011 +0000
Fix save if needed to always save on threshold
* file.c
* Init a signal that is fired upon the addition of a track
* The callback added one to a count for the track's itdb.
* When the count reaches the threshold, the itdb is saved.
* This is a single point of saving and will always be fired upon track
addition regardless of how the track was added, eg. by directory,
playlist
* Removal of all locations where save is called upon reaching threshold as
no longer necessary
libgtkpod/file.c | 131 ++++++++++++++------
libgtkpod/gtkpod_app_iface.c | 2 +-
.../playlist_display/playlist_display_actions.c | 7 -
3 files changed, 91 insertions(+), 49 deletions(-)
---
diff --git a/libgtkpod/file.c b/libgtkpod/file.c
index 5f288bb..6acd4de 100644
--- a/libgtkpod/file.c
+++ b/libgtkpod/file.c
@@ -59,6 +59,72 @@
static const gchar *imageext[] =
{ ".jpg", ".jpeg", ".png", ".pbm", ".pgm", ".ppm", ".tif", ".tiff",
".gif", NULL };
+/*
+ * Struct to hold the track added signal and
+ * hashtable of itdb to count of tracks added
+ * so far
+ */
+typedef struct {
+ gulong file_added_signal_id;
+ GHashTable *itdb_tracks_count;
+} TrackMonitor;
+
+/*
+ * Pair struct for insertion into the TrackMonitor
+ * hashtable
+ */
+typedef struct {
+ guint64 *id;
+ gint count;
+} TrackMonitorPair;
+
+/* Single TrackMonitor instance */
+static TrackMonitor *trkmonitor = NULL;
+
+/**
+ * Callback fired when a new track is added to an itdb.
+ * Will be fired from playlist, directory and file functions
+ */
+static void file_track_added_cb(GtkPodApp *app, gpointer tk, gpointer data) {
+ Track *track = tk;
+ if (!track)
+ return;
+
+ g_return_if_fail(track->itdb);
+ g_return_if_fail(trkmonitor);
+
+ guint64 *key = &track->itdb->id;
+ TrackMonitorPair *value =
g_hash_table_lookup(trkmonitor->itdb_tracks_count, key);
+ if (!value) {
+ value = g_new0(TrackMonitorPair, 1);
+ value->id = key;
+ value->count = 1;
+ } else {
+ value->count++;
+ }
+
+ /* save every ${file_threshold} files but do at least ${file_theshold}
first*/
+ int threshold = prefs_get_int("file_saving_threshold");
+ if (value->count >= threshold) {
+ gp_save_itdb(track->itdb);
+ gtkpod_tracks_statusbar_update();
+ // Reset the count
+ value->count = 0;
+ }
+
+ g_hash_table_replace(trkmonitor->itdb_tracks_count, key, value);
+}
+
+/**
+ * Initialise the file added signal with the callback
+ */
+static void init_file_added_signal() {
+ if (! trkmonitor) {
+ trkmonitor = g_new0(TrackMonitor, 1);
+ trkmonitor->itdb_tracks_count = g_hash_table_new (g_int64_hash,
g_int64_equal);
+ trkmonitor->file_added_signal_id = g_signal_connect (gtkpod_app,
SIGNAL_TRACK_ADDED, G_CALLBACK (file_track_added_cb), NULL);
+ }
+}
/* Determine the type of a file.
*
@@ -89,15 +155,6 @@ FileType *determine_filetype(const gchar *path) {
return type;
}
-static void save_if_needed(gint count, iTunesDB *itdb) {
- /* save every ${file_threshold} files but do at least ${file_theshold}
first*/
- int threshold = prefs_get_int("file_saving_threshold");
- if (count >= threshold && count % threshold == 0) {
- gp_save_itdb(itdb);
- gtkpod_tracks_statusbar_update();
- }
-}
-
/** check a filename against the "excludes file mask" from the preferences
* and return TRUE if it should be excluded based on the mask
*/
@@ -265,8 +322,8 @@ add_playlist_by_filename(iTunesDB *itdb, gchar *plfile,
Playlist *plitem, gint p
else if (strcmp(plfile, filename) == 0) {
gtkpod_warning(_("Skipping '%s' to avoid adding playlist file
recursively\n"), filename);
}
- else if (add_track_by_filename(itdb, filename, plitem,
prefs_get_int("add_recursively"), addtrackfunc, data)) {
- save_if_needed(tracks, itdb);
+ else {
+ add_track_by_filename(itdb, filename, plitem,
prefs_get_int("add_recursively"), addtrackfunc, data);
}
g_free(filename);
}
@@ -289,8 +346,23 @@ add_playlist_by_filename(iTunesDB *itdb, gchar *plfile,
Playlist *plitem, gint p
* *
\*------------------------------------------------------------------*/
-
-static gint add_directory_by_name_internal(iTunesDB *itdb, gchar *name,
Playlist *plitem, gboolean descend, gint *filecount, AddTrackFunc addtrackfunc,
gpointer data) {
+/*
+ * Add all files in directory and subdirectories.
+ *
+ * If @name is a regular file, just add that.
+ * If @plitem != NULL, add tracks also to Playlist @plitem
+ * @descend: TRUE: add recursively
+ * FALSE: don't enter subdirectories
+ * @addtrackfunc:
+ * if != NULL this will be called instead of
+ * "add_track_to_playlist () -- used for dropping
+ * tracks at a specific position in the track view
+ *
+ * return:
+ * value indicating number of added tracks.
+ */
+/* */
+gint add_directory_by_name(iTunesDB *itdb, gchar *name, Playlist *plitem,
gboolean descend, AddTrackFunc addtrackfunc, gpointer data) {
gint result = 0;
g_return_val_if_fail (itdb, 0);
@@ -306,7 +378,7 @@ static gint add_directory_by_name_internal(iTunesDB *itdb,
gchar *name, Playlist
if (next != NULL) {
gchar *nextfull = g_build_filename(name, next, NULL);
if (descend || !g_file_test(nextfull, G_FILE_TEST_IS_DIR))
{
- result += add_directory_by_name_internal(itdb,
nextfull, plitem, descend, filecount, addtrackfunc, data);
+ result += add_directory_by_name(itdb, nextfull,
plitem, descend, addtrackfunc, data);
}
g_free(nextfull);
}
@@ -318,37 +390,12 @@ static gint add_directory_by_name_internal(iTunesDB
*itdb, gchar *name, Playlist
release_widgets();
}
else {
- if (add_track_by_filename(itdb, name, plitem, descend, addtrackfunc,
data)) {
- *filecount = *filecount + 1;
- save_if_needed(*filecount, itdb);
- }
- result += *filecount;
+ if (add_track_by_filename(itdb, name, plitem, descend, addtrackfunc,
data))
+ result++;
}
return result;
}
-/*
- * Add all files in directory and subdirectories.
- *
- * If @name is a regular file, just add that.
- * If @plitem != NULL, add tracks also to Playlist @plitem
- * @descend: TRUE: add recursively
- * FALSE: don't enter subdirectories
- * @addtrackfunc:
- * if != NULL this will be called instead of
- * "add_track_to_playlist () -- used for dropping
- * tracks at a specific position in the track view
- *
- * return:
- * value indicating number of added tracks.
- */
-/* */
-gint add_directory_by_name(iTunesDB *itdb, gchar *name, Playlist *plitem,
gboolean descend, AddTrackFunc addtrackfunc, gpointer data) {
- /* Uses internal method so that a count parameter can be added for saving
purposes. */
- gint filecount = 0;
- return add_directory_by_name_internal(itdb, name, plitem, descend,
&filecount, addtrackfunc, data);
-}
-
/*------------------------------------------------------------------*\
* *
* Fill in track struct with data from file *
@@ -1462,6 +1509,8 @@ gboolean add_track_by_filename(iTunesDB *itdb, gchar
*fname, Playlist *plitem, g
mpl = itdb_playlist_mpl(itdb);
g_return_val_if_fail (mpl, FALSE);
+ init_file_added_signal();
+
if (!plitem)
plitem = mpl;
diff --git a/libgtkpod/gtkpod_app_iface.c b/libgtkpod/gtkpod_app_iface.c
index 2d1b2b6..612d367 100644
--- a/libgtkpod/gtkpod_app_iface.c
+++ b/libgtkpod/gtkpod_app_iface.c
@@ -300,7 +300,7 @@ void gtkpod_track_added(Track *track) {
g_return_if_fail (GTKPOD_IS_APP(gtkpod_app));
g_return_if_fail (track);
- g_signal_emit(gtkpod_app, gtkpod_app_signals[TRACK_UPDATED], 0, track);
+ g_signal_emit(gtkpod_app, gtkpod_app_signals[TRACK_ADDED], 0, track);
}
void gtkpod_track_removed(Track *track) {
diff --git a/plugins/playlist_display/playlist_display_actions.c
b/plugins/playlist_display/playlist_display_actions.c
index 4c50881..37c7075 100644
--- a/plugins/playlist_display/playlist_display_actions.c
+++ b/plugins/playlist_display/playlist_display_actions.c
@@ -234,10 +234,8 @@ static void create_add_playlists_dialog(iTunesDB *itdb) {
}
static void fileselection_add_files(GSList* names, Playlist *playlist) {
- gint count = 0;
GSList* gsl; /* Current node in list */
gboolean result = TRUE; /* Result of file adding */
- int threshold = prefs_get_int("file_saving_threshold");
/* If we don't have a playlist to add to, don't add anything */
g_return_if_fail (playlist);
@@ -249,11 +247,6 @@ static void fileselection_add_files(GSList* names,
Playlist *playlist) {
for (gsl = names; gsl; gsl = gsl->next) {
result
&= add_track_by_filename(playlist->itdb, gsl->data, playlist,
prefs_get_int("add_recursively"), NULL, NULL);
- count++;
- if (count % threshold == 0) { /* update and save every ten tracks
added */
- gp_save_itdb(playlist->itdb);
- gtkpod_tracks_statusbar_update();
- }
}
/* Final save of remaining added tracks */
------------------------------------------------------------------------------
Colocation vs. Managed Hosting
A question and answer guide to determining the best fit
for your organization - today and in the future.
http://p.sf.net/sfu/internap-sfd2d
_______________________________________________
gtkpod-cvs2 mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2