From b5caf6faed60238ba2c708a867299d119a021548 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Thu, 12 Nov 2015 09:38:35 -0500 Subject: [PATCH] core/tags/track: Convert std::string to gchar * Signed-off-by: Anna Schumaker --- core/library.cpp | 7 ++- core/tags/track.cpp | 118 +++++++++++++++++++++----------------- gui/gst.cpp | 14 +++-- gui/queue/model.cpp | 13 ++++- include/core/tags/track.h | 22 ++++--- tests/core/tags/track.cpp | 22 ++++--- 6 files changed, 119 insertions(+), 77 deletions(-) diff --git a/core/library.cpp b/core/library.cpp index 2ab72575..f6969352 100644 --- a/core/library.cpp +++ b/core/library.cpp @@ -82,7 +82,7 @@ static void scan_path(void *); */ static void tag_track(struct library *library, const std::string &filepath) { - struct track *track = track_add(library, filepath); + struct track *track = track_add(library, filepath.c_str()); if (track) library_q.add(track); } @@ -127,16 +127,19 @@ static void validate_library(void *data) struct library *library = (struct library *)data; struct db_entry *dbe, *next; struct track *track; + gchar *path; db_for_each(dbe, next, track_db_get()) { track = TRACK(dbe); if (track->tr_library != library) continue; - if (g_file_test(track_path(track).c_str(), G_FILE_TEST_EXISTS) == false) { + path = track_path(track); + if (g_file_test(path, G_FILE_TEST_EXISTS) == false) { library_q.del(track); track_remove(track); } + g_free(path); } } diff --git a/core/tags/track.cpp b/core/tags/track.cpp index c4115cd7..6010df38 100644 --- a/core/tags/track.cpp +++ b/core/tags/track.cpp @@ -13,13 +13,36 @@ extern "C" { static struct database track_db; -static gchar *__track_key(struct library *library, const std::string &path) +static gchar *__track_key(struct library *library, gchar *path) { - if (!library) - return g_strdup(""); - return g_strdup_printf("%u/%s", library->li_dbe.dbe_index, path.c_str()); + gchar *res; + + if (library) + res = g_strdup_printf("%u/%s", library->li_dbe.dbe_index, path); + else + res = g_strdup(""); + + g_free(path); + return res; } +static gchar *__track_path(struct track *track) +{ + gchar *path; + + sscanf(track->tr_path, "%*u/%m[^\n]", &path); + return path; +} + +static struct track *__track_alloc() +{ + struct track *track = new struct track; + + dbe_init(&track->tr_dbe, track); + return track; +} + + struct db_entry *track_alloc(const gchar *key) { const TagLib_AudioProperties *audio; @@ -28,7 +51,7 @@ struct db_entry *track_alloc(const gchar *key) unsigned int lib_id; TagLib_File *file; TagLib_Tag *tag; - char *fullpath, *path, *lower; + char *fullpath, *path; sscanf(key, "%u/%m[^\n]", &lib_id, &path); library = library_get(lib_id); @@ -39,8 +62,7 @@ struct db_entry *track_alloc(const gchar *key) goto out; } - track = new struct track; - dbe_init(&track->tr_dbe, track); + track = __track_alloc(); tag = taglib_file_tag(file); audio = taglib_file_audioproperties(file); @@ -54,17 +76,15 @@ struct db_entry *track_alloc(const gchar *key) track->tr_track = taglib_tag_track(tag); date_set(&track->tr_date, 0, 0, 0); - track->tr_path = path; - track->tr_title = taglib_tag_title(tag); - lower = string_lowercase(track->tr_title.c_str()); - track->tr_lower = lower; + track->tr_path = g_strdup(key); + track->tr_title = g_strdup(taglib_tag_title(tag)); + track->tr_lower = string_lowercase(track->tr_title); taglib_tag_free_strings(); taglib_file_free(file); - g_free(lower); out: - g_free(fullpath); g_free(path); + g_free(fullpath); return track ? &track->tr_dbe : NULL; } @@ -72,6 +92,9 @@ static void track_free(struct db_entry *dbe) { struct track *track = TRACK(dbe); + g_free(track->tr_title); + g_free(track->tr_lower); + if (track->tr_library) track->tr_library->li_size--; delete track; @@ -81,7 +104,7 @@ static void track_setup(struct db_entry *dbe) { struct track *track = TRACK(dbe); - filter_add(track->tr_lower.c_str(), dbe->dbe_index); + filter_add(track->tr_lower, dbe->dbe_index); filter_add(track->tr_artist->ar_lower, dbe->dbe_index); filter_add(track->tr_album->al_lower, dbe->dbe_index); track->tr_library->li_size++; @@ -89,41 +112,35 @@ static void track_setup(struct db_entry *dbe) static gchar *track_key(struct db_entry *dbe) { - return __track_key(TRACK(dbe)->tr_library, TRACK(dbe)->tr_path); + return TRACK(dbe)->tr_path; } static struct db_entry *track_read(struct file *file) { unsigned int library_id, artist_id, album_id, genre_id; - struct track *track = new struct track; - gchar *path, *name, *lower; + struct track *track = __track_alloc(); - dbe_init(&track->tr_dbe, track); file_readf(file, "%u %u %u %u %u", &library_id, &artist_id, &album_id, &genre_id, &track->tr_track); date_read(file, &track->tr_date); file_readf(file, "%u %u", &track->tr_count, &track->tr_length); - name = file_readl(file); - path = file_readl(file); - lower = string_lowercase(name); - track->tr_title = name; - track->tr_path = path; - track->tr_lower = lower; - g_free(name); - g_free(path); - g_free(lower); - - track->tr_library = library_get(library_id); - track->tr_artist = artist_get(artist_id); track->tr_album = album_get(album_id); + track->tr_artist = artist_get(artist_id); track->tr_genre = genre_get(genre_id); + track->tr_library = library_get(library_id); + + track->tr_title = file_readl(file); + track->tr_lower = string_lowercase(track->tr_title); + track->tr_path = __track_key(track->tr_library, file_readl(file)); return &track->tr_dbe; } static void track_write(struct file *file, struct db_entry *dbe) { struct track *track = TRACK(dbe); + gchar *path = __track_path(track); + file_writef(file, "%u %u %u %u %u ", track->tr_library->li_dbe.dbe_index, track->tr_artist->ar_dbe.dbe_index, track->tr_album->al_dbe.dbe_index, @@ -132,8 +149,10 @@ static void track_write(struct file *file, struct db_entry *dbe) date_write(file, &track->tr_date); file_writef(file, " %u %u %s\n%s\n", track->tr_count, track->tr_length, - track->tr_title.c_str(), - track->tr_path.c_str()); + track->tr_title, + path); + + g_free(path); } @@ -168,10 +187,10 @@ const struct database *track_db_get() return &track_db; } -struct track *track_add(struct library *library, const std::string &filepath) +struct track *track_add(struct library *library, const gchar *filepath) { - std::string path = filepath.substr(strlen(library->li_path) + 1); - gchar *key = __track_key(library, path); + unsigned int offset = strlen(library->li_path) + 1; + gchar *key = __track_key(library, g_strdup(filepath + offset)); struct track *track = NULL; if (!db_get(&track_db, key)) @@ -204,19 +223,20 @@ struct track *track_get(const unsigned int index) int track_compare(struct track *lhs, struct track *rhs) { - return string_compare(lhs->tr_lower.c_str(), rhs->tr_lower.c_str()); + return string_compare(lhs->tr_lower, rhs->tr_lower); } -const std::string track_path(struct track *track) +gchar *track_path(struct track *track) { - std::string ret = ""; + gchar *path, *res; if (track->tr_library) { - gchar *g_ret = library_file(track->tr_library, track->tr_path.c_str()); - ret = g_ret; - g_free(g_ret); + path = __track_path(track); + res = library_file(track->tr_library, path); + g_free(path); + return res; } - return ret; + return g_strdup(""); } void track_played(struct track *track) @@ -226,17 +246,11 @@ void track_played(struct track *track) track_db_commit(); } -const std::string track_last_play(struct track *track) +gchar *track_last_play(struct track *track) { - std::string res = "Never"; - char *buf; - - if (track->tr_count > 0) { - buf = date_string(&track->tr_date); - res = buf; - g_free(buf); - } - return res; + if (track->tr_count > 0) + return date_string(&track->tr_date); + return g_strdup("Never"); } #ifdef CONFIG_TESTING diff --git a/gui/gst.cpp b/gui/gst.cpp index 4461c615..5d9e359b 100644 --- a/gui/gst.cpp +++ b/gui/gst.cpp @@ -59,8 +59,9 @@ class GSTDriver : public AudioDriver public: void load(struct track *track) { - gchar *uri = gst_filename_to_uri(track_path(track).c_str(), NULL); - gchar *len = string_sec2str(track->tr_length); + gchar *path = track_path(track); + gchar *uri = gst_filename_to_uri(path, NULL); + gchar *len = string_sec2str(track->tr_length); gchar *str; gst_change_state(GST_STATE_NULL); @@ -78,6 +79,7 @@ public: set_markup(o_title, "xx-large", track->tr_title); o_duration->set_text(len); + g_free(path); g_free(len); plist :: track_loaded(track); @@ -145,11 +147,15 @@ static void parse_gst_error(GstMessage *error) { GError *err; struct track *track = audio :: current_track(); + gchar *path; gst_message_parse_error(error, &err, NULL); - if (track) - g_print("Error playing file: %s\n", track_path(track).c_str()); + if (track) { + path = track_path(track); + g_print("Error playing file: %s\n", path); + g_free(path); + } g_print("Error: %s\n", err->message); g_error_free(err); } diff --git a/gui/queue/model.cpp b/gui/queue/model.cpp index d9ebb329..ed649410 100644 --- a/gui/queue/model.cpp +++ b/gui/queue/model.cpp @@ -111,7 +111,8 @@ void QueueModel::get_value_vfunc(const Gtk::TreeIter &iter, int column, case 0: return set_val(track->tr_track, value); case 1: - return set_val(track->tr_title, value); + field = track->tr_title; + return set_val(field, value); case 2: str = string_sec2str(track->tr_length); set_val(Glib::ustring(str), value); @@ -131,9 +132,15 @@ void QueueModel::get_value_vfunc(const Gtk::TreeIter &iter, int column, case 7: return set_val(track->tr_count, value); case 8: - return set_val(track_last_play(track), value); + str = track_last_play(track); + set_val(Glib::Markup::escape_text(str), value); + g_free(str); + return; case 9: - return set_val(Glib::Markup::escape_text(track_path(track)), value); + str = track_path(track); + set_val(Glib::Markup::escape_text(str), value); + g_free(str); + return; } } diff --git a/include/core/tags/track.h b/include/core/tags/track.h index 9967902e..d730ef8e 100644 --- a/include/core/tags/track.h +++ b/include/core/tags/track.h @@ -31,9 +31,9 @@ struct track { unsigned int tr_track; /* This track's track number. */ struct date tr_date; /* This track's last-played date. */ - std::string tr_path; /* This track's path, relative to the library. */ - std::string tr_title; /* This track's title. */ - std::string tr_lower; /* This track's title (lowercased). */ + gchar *tr_path; /* This track's path, relative to the library. */ + gchar *tr_title; /* This track's title. */ + gchar *tr_lower; /* This track's title (lowercased). */ struct db_entry tr_dbe; }; @@ -54,7 +54,7 @@ void track_db_commit(); const struct database *track_db_get(); /* Called to add a track tag to the database. */ -struct track *track_add(struct library *, const std::string &); +struct track *track_add(struct library *, const gchar *); /* Called to remove a specific track tag. */ void track_remove(struct track *); @@ -68,14 +68,20 @@ struct track *track_get(const unsigned int); /* Called to compare two track tags */ int track_compare(struct track *, struct track *); -/* Called to find the full path of the track tag. */ -const std::string track_path(struct track *); +/* + * Called to find the full path of the track tag. + * This function returns a new string that MUST be freed with g_free(). + */ +gchar *track_path(struct track *); /* Called to mark a track tag as played. */ void track_played(struct track *); -/* Called to find the date that this track was last played. */ -const std::string track_last_play(struct track *); +/* + * Called to find the date that this track was last played. + * This function returns a new string that MUST be freed with g_free(). + */ +gchar *track_last_play(struct track *); #ifdef CONFIG_TESTING const struct db_ops *test_track_ops(); diff --git a/tests/core/tags/track.cpp b/tests/core/tags/track.cpp index 9b8601da..20471e45 100644 --- a/tests/core/tags/track.cpp +++ b/tests/core/tags/track.cpp @@ -34,11 +34,11 @@ static void test_verify_track(struct track *track) test_equal(track->tr_title, "Title Theme"); test_equal(track->tr_lower, "title theme"); - test_str_equal(track_ops->dbe_key(&track->tr_dbe), + test_equal(track_ops->dbe_key(&track->tr_dbe), "0/Hyrule Symphony/01 - Title Theme.ogg"); - test_equal(track_path(track), + test_str_equal(track_path(track), "tests/Music/Hyrule Symphony/01 - Title Theme.ogg"); - test_equal(track_last_play(track), "Never"); + test_str_equal(track_last_play(track), "Never"); test_equal(track->tr_track, 1); test_equal(track->tr_length, 243); @@ -52,11 +52,11 @@ static void test_verify_notrack(struct track *track) test_equal(track->tr_title, ""); test_equal(track->tr_lower, ""); - test_str_equal(track_ops->dbe_key(&track->tr_dbe), + test_equal(track_ops->dbe_key(&track->tr_dbe), "0/Hyrule Symphony/00 - No Track.ogg"); - test_equal(track_path(track), + test_str_equal(track_path(track), "tests/Music/Hyrule Symphony/00 - No Track.ogg"); - test_equal(track_last_play(track), "Never"); + test_str_equal(track_last_play(track), "Never"); test_equal(track->tr_track, 0); test_equal(track->tr_length, 0); @@ -92,6 +92,7 @@ static void test_track() track_ops->dbe_write(&f, &track->tr_dbe); file_close(&f); + g_free(track->tr_path); track_ops->dbe_free(&track->tr_dbe); test_equal(library->li_size, 0); @@ -101,6 +102,8 @@ static void test_track() track_ops->dbe_setup(&track->tr_dbe); test_verify_notrack(track); test_equal(library->li_size, 1); + + g_free(track->tr_path); track_ops->dbe_free(&track->tr_dbe); track = TRACK(track_ops->dbe_read(&f)); @@ -112,8 +115,9 @@ static void test_track() track_played(track); test_equal(track->tr_count, 1); - test_equal(track_last_play(track), date); + test_str_equal(track_last_play(track), date); + g_free(track->tr_path); track_ops->dbe_free(&track->tr_dbe); g_free(date); } @@ -150,13 +154,15 @@ static void test_track_compare() test_equal(track_compare(kokiri, title), -1); test_equal(track_compare(title, kokiri), 1); + g_free(title->tr_path); + g_free(kokiri->tr_path); track_ops->dbe_free(&title->tr_dbe); track_ops->dbe_free(&kokiri->tr_dbe); } static void test_track_db() { - std::string path = "tests/Music/Hyrule Symphony/01 - Title Theme.ogg"; + const gchar *path = "tests/Music/Hyrule Symphony/01 - Title Theme.ogg"; struct library *library = library_find("tests/Music"); const struct db_ops *track_ops = test_track_ops(); struct database track_db;