From ff87145537f1d71388be8759688235a75fccf373 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 29 Jan 2014 17:45:07 +0100 Subject: sticker: don't use classes Directory and Song Don't depend on the "simple" database plugin. This fixes an assertion failure / crash and allows using stickers with other plugins. --- src/sticker/SongSticker.cxx | 24 +++++++++++++++--------- src/sticker/SongSticker.hxx | 4 ++-- 2 files changed, 17 insertions(+), 11 deletions(-) (limited to 'src/sticker') diff --git a/src/sticker/SongSticker.cxx b/src/sticker/SongSticker.cxx index 3431a1702..4bcc8979f 100644 --- a/src/sticker/SongSticker.cxx +++ b/src/sticker/SongSticker.cxx @@ -21,8 +21,9 @@ #include "SongSticker.hxx" #include "StickerDatabase.hxx" #include "db/LightSong.hxx" -#include "db/Song.hxx" -#include "db/Directory.hxx" +#include "db/DatabaseGlue.hxx" +#include "db/DatabasePlugin.hxx" +#include "util/Error.hxx" #include @@ -66,7 +67,7 @@ sticker_song_get(const LightSong &song) } struct sticker_song_find_data { - Directory *directory; + const Database *db; const char *base_uri; size_t base_uri_length; @@ -85,24 +86,29 @@ sticker_song_find_cb(const char *uri, const char *value, void *user_data) /* should not happen, ignore silently */ return; - Song *song = data->directory->LookupSong(uri + data->base_uri_length); - if (song != nullptr) - data->func(song->Export(), value, data->user_data); + const Database *db = data->db; + const LightSong *song = db->GetSong(uri, IgnoreError()); + if (song != nullptr) { + data->func(*song, value, data->user_data); + db->ReturnSong(song); + } } bool -sticker_song_find(Directory &directory, const char *name, +sticker_song_find(const char *base_uri, const char *name, void (*func)(const LightSong &song, const char *value, void *user_data), void *user_data) { struct sticker_song_find_data data; - data.directory = &directory; + data.db = GetDatabase(); + assert(data.db != nullptr); + data.func = func; data.user_data = user_data; char *allocated; - data.base_uri = directory.GetPath(); + data.base_uri = base_uri; if (*data.base_uri != 0) /* append slash to base_uri */ data.base_uri = allocated = diff --git a/src/sticker/SongSticker.hxx b/src/sticker/SongSticker.hxx index 2f977bd21..a49674150 100644 --- a/src/sticker/SongSticker.hxx +++ b/src/sticker/SongSticker.hxx @@ -72,13 +72,13 @@ sticker_song_get(const LightSong &song); * * Caller must lock the #db_mutex. * - * @param directory the base directory to search in + * @param base_uri the base directory to search in * @param name the name of the sticker * @return true on success (even if no sticker was found), false on * failure */ bool -sticker_song_find(Directory &directory, const char *name, +sticker_song_find(const char *base_uri, const char *name, void (*func)(const LightSong &song, const char *value, void *user_data), void *user_data); -- cgit v1.2.3