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.
This commit is contained in:
Max Kellermann
2014-01-10 20:18:13 +01:00
parent 74842fd6d4
commit 09b00fa4e3
3 changed files with 72 additions and 42 deletions
+6 -6
View File
@@ -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;
}
}
+15 -6
View File
@@ -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();
}
};