diff options
author | Max Kellermann <max@duempel.org> | 2014-01-10 20:18:13 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2014-01-10 22:56:52 +0100 |
commit | 09b00fa4e318af53821318a502010eb10b5064de (patch) | |
tree | feb8ee2b333568fda611d87158514e85917bef34 | |
parent | 74842fd6d4d1cd35c7e80935e42d9b010751be49 (diff) | |
download | mpd-09b00fa4e318af53821318a502010eb10b5064de.tar.gz mpd-09b00fa4e318af53821318a502010eb10b5064de.tar.xz mpd-09b00fa4e318af53821318a502010eb10b5064de.zip |
db/upnp/Object: use strictly-typed enums
At the same time, rename the enum types and the class attributes, and
add an "UNKNOWN" type/class. The latter avoids the "-1" hack.
-rw-r--r-- | src/db/UpnpDatabasePlugin.cxx | 85 | ||||
-rw-r--r-- | src/db/upnp/Directory.cxx | 12 | ||||
-rw-r--r-- | src/db/upnp/Object.hxx | 21 |
3 files changed, 74 insertions, 44 deletions
diff --git a/src/db/UpnpDatabasePlugin.cxx b/src/db/UpnpDatabasePlugin.cxx index 809557de4..a1b6519e0 100644 --- a/src/db/UpnpDatabasePlugin.cxx +++ b/src/db/UpnpDatabasePlugin.cxx @@ -721,18 +721,27 @@ UpnpDatabase::VisitServer(ContentDirectoryService* server, return SearchSongs(server, objid.c_str(), selection, visit_song, error); - if (tdirent.m_type == UPnPDirObject::item) { + if (tdirent.type == UPnPDirObject::Type::ITEM) { // Target is a song. Not too sure we ever get there actually, maybe // this is always catched by the special uri test above. - if (visit_song && - tdirent.m_iclass == UPnPDirObject::audioItem_musicTrack) { - return visitSong(tdirent, "", selection, visit_song, - error); - } else if (visit_playlist && - tdirent.m_iclass == UPnPDirObject::audioItem_playlist) { - // Note: I've yet to see a playlist item (playlists - // seem to be usually handled as containers, so I'll - // decide what to do when I see one... + switch (tdirent.item_class) { + case UPnPDirObject::ItemClass::MUSIC: + if (visit_song) + return visitSong(tdirent, "", selection, visit_song, + error); + break; + + case UPnPDirObject::ItemClass::PLAYLIST: + if (visit_playlist) { + /* Note: I've yet to see a playlist + item (playlists seem to be usually + handled as containers, so I'll decide + what to do when I see one... */ + } + break; + + case UPnPDirObject::ItemClass::UNKNOWN: + break; } return true; @@ -757,28 +766,40 @@ UpnpDatabase::VisitServer(ContentDirectoryService* server, if (visit_song || visit_playlist) { for (const auto &dirent : dirbuf.m_items) { - if (visit_song && - dirent.m_iclass == UPnPDirObject::audioItem_musicTrack) { - /* We identify songs by giving them a - special path. The Id is enough to - fetch them from the server - anyway. */ - - std::string p; - if (!selection.recursive) - p = selection.uri + "/" + - titleToPathElt(dirent.m_title); - - if (!visitSong(dirent, p.c_str(), - selection, visit_song, error)) - return false; - } else if (visit_playlist && - dirent.m_iclass == UPnPDirObject::audioItem_playlist) { - /* Note: I've yet to see a playlist - item (playlists seem to be usually - handled as containers, so I'll - decide what to do when I see - one... */ + switch (dirent.item_class) { + case UPnPDirObject::ItemClass::MUSIC: + if (visit_song) { + /* We identify songs by giving + them a special path. The Id + is enough to fetch them + from the server anyway. */ + + std::string p; + if (!selection.recursive) + p = selection.uri + "/" + + titleToPathElt(dirent.m_title); + + if (!visitSong(dirent, p.c_str(), + selection, visit_song, error)) + return false; + } + + break; + + case UPnPDirObject::ItemClass::PLAYLIST: + if (visit_playlist) { + /* Note: I've yet to see a + playlist item (playlists + seem to be usually handled + as containers, so I'll + decide what to do when I + see one... */ + } + + break; + + case UPnPDirObject::ItemClass::UNKNOWN: + break; } } } diff --git a/src/db/upnp/Directory.cxx b/src/db/upnp/Directory.cxx index 895e767be..da55f08e5 100644 --- a/src/db/upnp/Directory.cxx +++ b/src/db/upnp/Directory.cxx @@ -56,9 +56,9 @@ public: :m_dir(dir) { m_okitems["object.item.audioItem.musicTrack"] = - UPnPDirObject::audioItem_musicTrack; + UPnPDirObject::ItemClass::MUSIC; m_okitems["object.item.playlistItem"] = - UPnPDirObject::audioItem_playlist; + UPnPDirObject::ItemClass::PLAYLIST; } UPnPDirContent& m_dir; @@ -74,7 +74,7 @@ protected: case 'c': if (!strcmp(name, "container")) { m_tobj.clear(); - m_tobj.m_type = UPnPDirObject::container; + m_tobj.type = UPnPDirObject::Type::CONTAINER; m_tobj.m_id = m_path.back().attributes["id"]; m_tobj.m_pid = m_path.back().attributes["parentID"]; } @@ -82,7 +82,7 @@ protected: case 'i': if (!strcmp(name, "item")) { m_tobj.clear(); - m_tobj.m_type = UPnPDirObject::item; + m_tobj.type = UPnPDirObject::Type::ITEM; m_tobj.m_id = m_path.back().attributes["id"]; m_tobj.m_pid = m_path.back().attributes["parentID"]; } @@ -96,14 +96,14 @@ protected: bool ok = !m_tobj.m_id.empty() && !m_tobj.m_pid.empty() && !m_tobj.m_title.empty(); - if (ok && m_tobj.m_type == UPnPDirObject::item) { + if (ok && m_tobj.type == UPnPDirObject::Type::ITEM) { auto it = m_okitems.find(m_tobj.m_props["upnp:class"]); if (it == m_okitems.end()) { PLOGINF("checkobjok: found object of unknown class: [%s]\n", m_tobj.m_props["upnp:class"].c_str()); ok = false; } else { - m_tobj.m_iclass = it->second; + m_tobj.item_class = it->second; } } diff --git a/src/db/upnp/Object.hxx b/src/db/upnp/Object.hxx index 4949146e8..a3bb026b8 100644 --- a/src/db/upnp/Object.hxx +++ b/src/db/upnp/Object.hxx @@ -30,7 +30,12 @@ */ class UPnPDirObject { public: - enum ObjType {item, container}; + enum class Type { + UNKNOWN, + ITEM, + CONTAINER, + }; + // There are actually several kinds of containers: // object.container.storageFolder, object.container.person, // object.container.playlistContainer etc., but they all seem to @@ -38,13 +43,17 @@ public: // items are special to us, and so should playlists, but I've not // seen one of the latter yet (servers seem to use containers for // playlists). - enum ItemClass {audioItem_musicTrack, audioItem_playlist}; + enum class ItemClass { + UNKNOWN, + MUSIC, + PLAYLIST, + }; std::string m_id; // ObjectId std::string m_pid; // Parent ObjectId std::string m_title; // dc:title. Directory name for a container. - ObjType m_type; // item or container - ItemClass m_iclass; + Type type; + ItemClass item_class; // Properties as gathered from the XML document (url, artist, etc.) // The map keys are the XML tag or attribute names. std::map<std::string, std::string> m_props; @@ -68,8 +77,8 @@ public: m_id.clear(); m_pid.clear(); m_title.clear(); - m_type = (ObjType)-1; - m_iclass = (ItemClass)-1; + type = Type::UNKNOWN; + item_class = ItemClass::UNKNOWN; m_props.clear(); } }; |