From 169db88c20dc7601f8589cfa298254c932f0947a Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 10 Sep 2011 19:24:30 +0200 Subject: database: add struct db_visitor Use this struct for db_walk(). --- src/directory.c | 44 +++++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 19 deletions(-) (limited to 'src/directory.c') diff --git a/src/directory.c b/src/directory.c index d8b241118..eb076d94d 100644 --- a/src/directory.c +++ b/src/directory.c @@ -21,6 +21,7 @@ #include "directory.h" #include "song.h" #include "path.h" +#include "db_visitor.h" #include @@ -167,28 +168,33 @@ directory_sort(struct directory *directory) directory_sort(dv->base[i]); } -int +bool directory_walk(struct directory *directory, - int (*forEachSong)(struct song *, void *), - int (*forEachDir)(struct directory *, void *), - void *data) + const struct db_visitor *visitor, void *ctx, + GError **error_r) { - struct dirvec *dv = &directory->children; - int err = 0; - size_t j; - - if (forEachDir && (err = forEachDir(directory, data)) < 0) - return err; - - if (forEachSong) { - err = songvec_for_each(&directory->songs, forEachSong, data); - if (err < 0) - return err; + assert(directory != NULL); + assert(visitor != NULL); + assert(error_r == NULL || *error_r == NULL); + + if (visitor->directory != NULL && + !visitor->directory(directory, ctx, error_r)) + return false; + + if (visitor->song != NULL) { + struct songvec *sv = &directory->songs; + for (size_t i = 0; i < sv->nr; ++i) + if (!visitor->song(sv->base[i], ctx, error_r)) + return false; } - for (j = 0; err >= 0 && j < dv->nr; ++j) - err = directory_walk(dv->base[j], forEachSong, - forEachDir, data); + if (visitor->directory != NULL) { + const struct dirvec *dv = &directory->children; + for (size_t i = 0; i < dv->nr; ++i) + if (!directory_walk(dv->base[i], visitor, ctx, + error_r)) + return false; + } - return err; + return true; } -- cgit v1.2.3