aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2014-01-10 20:18:13 +0100
committerMax Kellermann <max@duempel.org>2014-01-10 22:56:52 +0100
commit09b00fa4e318af53821318a502010eb10b5064de (patch)
treefeb8ee2b333568fda611d87158514e85917bef34
parent74842fd6d4d1cd35c7e80935e42d9b010751be49 (diff)
downloadmpd-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.cxx85
-rw-r--r--src/db/upnp/Directory.cxx12
-rw-r--r--src/db/upnp/Object.hxx21
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();
}
};