diff options
author | Max Kellermann <max@duempel.org> | 2009-04-01 18:44:26 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-04-01 18:44:26 +0200 |
commit | c51e1bf1c093f823fca3ecbf3fe87e1ce1c6059a (patch) | |
tree | 20fbcacd9179caec0b2d31eb1c7f442f557d5223 | |
parent | 3a4d20faa2ee6e5e514b82a92c7973978679d47d (diff) | |
download | mpd-c51e1bf1c093f823fca3ecbf3fe87e1ce1c6059a.tar.gz mpd-c51e1bf1c093f823fca3ecbf3fe87e1ce1c6059a.tar.xz mpd-c51e1bf1c093f823fca3ecbf3fe87e1ce1c6059a.zip |
song_sticker: added song_sticker_find()
This is a wrapper for sticker_find(), which looks up the song object.
-rw-r--r-- | src/song_sticker.c | 60 | ||||
-rw-r--r-- | src/song_sticker.h | 16 |
2 files changed, 76 insertions, 0 deletions
diff --git a/src/song_sticker.c b/src/song_sticker.c index 54792678a..131519bcd 100644 --- a/src/song_sticker.c +++ b/src/song_sticker.c @@ -19,11 +19,13 @@ #include "song_sticker.h" #include "song.h" +#include "directory.h" #include "sticker.h" #include <glib.h> #include <assert.h> +#include <string.h> char * sticker_song_get_value(const struct song *song, const char *name) @@ -88,3 +90,61 @@ sticker_song_get(const struct song *song) return sticker; } + +struct sticker_song_find_data { + struct directory *directory; + const char *base_uri; + size_t base_uri_length; + + void (*func)(struct song *song, const char *value, + gpointer user_data); + gpointer user_data; +}; + +static void +sticker_song_find_cb(const char *uri, const char *value, gpointer user_data) +{ + struct sticker_song_find_data *data = user_data; + struct song *song; + + if (memcmp(uri, data->base_uri, data->base_uri_length) != 0) + /* should not happen, ignore silently */ + return; + + song = directory_lookup_song(data->directory, + uri + data->base_uri_length); + if (song != NULL) + data->func(song, value, data->user_data); +} + +bool +sticker_song_find(struct directory *directory, const char *name, + void (*func)(struct song *song, const char *value, + gpointer user_data), + gpointer user_data) +{ + struct sticker_song_find_data data = { + .directory = directory, + .func = func, + .user_data = user_data, + }; + char *allocated; + bool success; + + data.base_uri = directory_get_path(directory); + if (*data.base_uri != 0) + /* append slash to base_uri */ + data.base_uri = allocated = + g_strconcat(data.base_uri, "/", NULL); + else + /* searching in root directory - no trailing slash */ + allocated = NULL; + + data.base_uri_length = strlen(data.base_uri); + + success = sticker_find("song", data.base_uri, name, + sticker_song_find_cb, &data); + g_free(allocated); + + return success; +} diff --git a/src/song_sticker.h b/src/song_sticker.h index 9b32c9215..435e4c935 100644 --- a/src/song_sticker.h +++ b/src/song_sticker.h @@ -24,6 +24,7 @@ #include <glib.h> struct song; +struct directory; struct sticker; /** @@ -56,4 +57,19 @@ sticker_song_delete(const struct song *song); struct sticker * sticker_song_get(const struct song *song); +/** + * Finds stickers with the specified name below the specified + * directory. + * + * @param directory 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(struct directory *directory, const char *name, + void (*func)(struct song *song, const char *value, + gpointer user_data), + gpointer user_data); + #endif |