diff options
Diffstat (limited to 'src/db/plugins/upnp/UpnpDatabasePlugin.cxx')
-rw-r--r-- | src/db/plugins/upnp/UpnpDatabasePlugin.cxx | 137 |
1 files changed, 58 insertions, 79 deletions
diff --git a/src/db/plugins/upnp/UpnpDatabasePlugin.cxx b/src/db/plugins/upnp/UpnpDatabasePlugin.cxx index 684ee4c40..702a37602 100644 --- a/src/db/plugins/upnp/UpnpDatabasePlugin.cxx +++ b/src/db/plugins/upnp/UpnpDatabasePlugin.cxx @@ -103,23 +103,21 @@ public: } private: - bool VisitServer(const ContentDirectoryService &server, + void VisitServer(const ContentDirectoryService &server, const std::list<std::string> &vpath, const DatabaseSelection &selection, VisitDirectory visit_directory, VisitSong visit_song, - VisitPlaylist visit_playlist, - Error &error) const; + VisitPlaylist visit_playlist) const; /** * Run an UPnP search according to MPD parameters, and * visit_song the results. */ - bool SearchSongs(const ContentDirectoryService &server, + void SearchSongs(const ContentDirectoryService &server, const char *objid, const DatabaseSelection &selection, - VisitSong visit_song, - Error &error) const; + VisitSong visit_song) const; UPnPDirContent SearchSongs(const ContentDirectoryService &server, const char *objid, @@ -307,13 +305,13 @@ UpnpDatabase::SearchSongs(const ContentDirectoryService &server, return server.search(handle, objid, cond.c_str()); } -static bool +static void visitSong(const UPnPDirObject &meta, const char *path, const DatabaseSelection &selection, - VisitSong visit_song, Error& error) + VisitSong visit_song) { if (!visit_song) - return true; + return; LightSong song; song.directory = nullptr; @@ -323,7 +321,8 @@ visitSong(const UPnPDirObject &meta, const char *path, song.mtime = 0; song.start_time = song.end_time = SongTime::zero(); - return !selection.Match(song) || visit_song(song, error); + if (selection.Match(song)) + visit_song(song); } /** @@ -338,15 +337,14 @@ songPath(const std::string &servername, return servername + "/" + rootid + "/" + objid; } -bool +void UpnpDatabase::SearchSongs(const ContentDirectoryService &server, const char *objid, const DatabaseSelection &selection, - VisitSong visit_song, - Error &error) const + VisitSong visit_song) const { if (!visit_song) - return true; + return; for (auto &dirent : SearchSongs(server, objid, selection).objects) { if (dirent.type != UPnPDirObject::Type::ITEM || @@ -371,13 +369,9 @@ UpnpDatabase::SearchSongs(const ContentDirectoryService &server, // which we later have to detect. const std::string path = songPath(server.getFriendlyName(), dirent.id); - if (!visitSong(std::move(dirent), path.c_str(), - selection, visit_song, - error)) - return false; + visitSong(std::move(dirent), path.c_str(), + selection, visit_song); } - - return true; } UPnPDirObject @@ -444,19 +438,17 @@ UpnpDatabase::Namei(const ContentDirectoryService &server, } } -static bool +static void VisitItem(const UPnPDirObject &object, const char *uri, const DatabaseSelection &selection, - VisitSong visit_song, VisitPlaylist visit_playlist, - Error &error) + VisitSong visit_song, VisitPlaylist visit_playlist) { assert(object.type == UPnPDirObject::Type::ITEM); switch (object.item_class) { case UPnPDirObject::ItemClass::MUSIC: - return !visit_song || - visitSong(object, uri, - selection, visit_song, error); + visitSong(object, uri, selection, visit_song); + break; case UPnPDirObject::ItemClass::PLAYLIST: if (visit_playlist) { @@ -468,23 +460,19 @@ VisitItem(const UPnPDirObject &object, const char *uri, see one... */ } - return true; + break; case UPnPDirObject::ItemClass::UNKNOWN: - return true; + break; } - - assert(false); - gcc_unreachable(); } -static bool +static void VisitObject(const UPnPDirObject &object, const char *uri, const DatabaseSelection &selection, VisitDirectory visit_directory, VisitSong visit_song, - VisitPlaylist visit_playlist, - Error &error) + VisitPlaylist visit_playlist) { switch (object.type) { case UPnPDirObject::Type::UNKNOWN: @@ -492,29 +480,26 @@ VisitObject(const UPnPDirObject &object, const char *uri, gcc_unreachable(); case UPnPDirObject::Type::CONTAINER: - return !visit_directory || - visit_directory(LightDirectory(uri, 0), error); + if (visit_directory) + visit_directory(LightDirectory(uri, 0)); + break; case UPnPDirObject::Type::ITEM: - return VisitItem(object, uri, selection, - visit_song, visit_playlist, - error); + VisitItem(object, uri, selection, + visit_song, visit_playlist); + break; } - - assert(false); - gcc_unreachable(); } // vpath is a parsed and writeable version of selection.uri. There is // really just one path parameter. -bool +void UpnpDatabase::VisitServer(const ContentDirectoryService &server, const std::list<std::string> &vpath, const DatabaseSelection &selection, VisitDirectory visit_directory, VisitSong visit_song, - VisitPlaylist visit_playlist, - Error &error) const + VisitPlaylist visit_playlist) const { /* If the path begins with rootid, we know that this is a song, not a directory (because that's how we set things @@ -527,7 +512,7 @@ UpnpDatabase::VisitServer(const ContentDirectoryService &server, if (!vpath.empty() && vpath.front() == rootid) { switch (vpath.size()) { case 1: - return true; + return; case 2: break; @@ -547,12 +532,11 @@ UpnpDatabase::VisitServer(const ContentDirectoryService &server, std::string path = songPath(server.getFriendlyName(), dirent.id); - if (!visitSong(std::move(dirent), path.c_str(), - selection, - visit_song, error)) - return false; + visitSong(std::move(dirent), path.c_str(), + selection, visit_song); } - return true; + + return; } // Translate the target path into an object id and the associated metadata. @@ -562,19 +546,20 @@ UpnpDatabase::VisitServer(const ContentDirectoryService &server, if the filter is empty. In this case, we implement limited recursion (1-deep) here, which will handle the "add dir" case. */ - if (selection.recursive && selection.filter) - return SearchSongs(server, tdirent.id.c_str(), selection, - visit_song, error); + if (selection.recursive && selection.filter) { + SearchSongs(server, tdirent.id.c_str(), selection, visit_song); + return; + } const char *const base_uri = selection.uri.empty() ? server.getFriendlyName() : selection.uri.c_str(); if (tdirent.type == UPnPDirObject::Type::ITEM) { - return VisitItem(tdirent, base_uri, - selection, - visit_song, visit_playlist, - error); + VisitItem(tdirent, base_uri, + selection, + visit_song, visit_playlist); + return; } /* Target was a a container. Visit it. We could read slices @@ -583,15 +568,11 @@ UpnpDatabase::VisitServer(const ContentDirectoryService &server, for (const auto &dirent : server.readDir(handle, tdirent.id.c_str()).objects) { const std::string uri = PathTraitsUTF8::Build(base_uri, dirent.name.c_str()); - if (!VisitObject(dirent, uri.c_str(), - selection, - visit_directory, - visit_song, visit_playlist, - error)) - return false; + VisitObject(dirent, uri.c_str(), + selection, + visit_directory, + visit_song, visit_playlist); } - - return true; } // Deal with the possibly multiple servers, call VisitServer if needed. @@ -600,22 +581,20 @@ UpnpDatabase::Visit(const DatabaseSelection &selection, VisitDirectory visit_directory, VisitSong visit_song, VisitPlaylist visit_playlist, - Error &error) const + Error &) const { auto vpath = stringToTokens(selection.uri, "/", true); if (vpath.empty()) { for (const auto &server : discovery->GetDirectories()) { if (visit_directory) { const LightDirectory d(server.getFriendlyName(), 0); - if (!visit_directory(d, error)) - return false; + visit_directory(d); } - if (selection.recursive && - !VisitServer(server, vpath, selection, - visit_directory, visit_song, visit_playlist, - error)) - return false; + if (selection.recursive) + VisitServer(server, vpath, selection, + visit_directory, visit_song, + visit_playlist); } return true; @@ -626,15 +605,16 @@ UpnpDatabase::Visit(const DatabaseSelection &selection, vpath.pop_front(); auto server = discovery->GetServer(servername.c_str()); - return VisitServer(server, vpath, selection, - visit_directory, visit_song, visit_playlist, error); + VisitServer(server, vpath, selection, + visit_directory, visit_song, visit_playlist); + return true; } bool UpnpDatabase::VisitUniqueTags(const DatabaseSelection &selection, TagType tag, gcc_unused tag_mask_t group_mask, VisitTag visit_tag, - Error &error) const + Error &) const { // TODO: use group_mask @@ -664,8 +644,7 @@ UpnpDatabase::VisitUniqueTags(const DatabaseSelection &selection, for (const auto& value : values) { TagBuilder builder; builder.AddItem(tag, value.c_str()); - if (!visit_tag(builder.Commit(), error)) - return false; + visit_tag(builder.Commit()); } return true; |