ProxyDatabasePlugin: add OO wrapper for mpd_entity
Let the C++ compiler take care for freeing the objects safely.
This commit is contained in:
parent
0ed71fa027
commit
fcf0f8291d
@ -267,13 +267,39 @@ Visit(struct directory &parent, const struct mpd_playlist *playlist,
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::list<struct mpd_entity *>
|
class ProxyEntity {
|
||||||
|
struct mpd_entity *entity;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ProxyEntity(struct mpd_entity *_entity)
|
||||||
|
:entity(_entity) {}
|
||||||
|
|
||||||
|
ProxyEntity(const ProxyEntity &other) = delete;
|
||||||
|
|
||||||
|
ProxyEntity(ProxyEntity &&other)
|
||||||
|
:entity(other.entity) {
|
||||||
|
other.entity = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
~ProxyEntity() {
|
||||||
|
if (entity != nullptr)
|
||||||
|
mpd_entity_free(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
ProxyEntity &operator=(const ProxyEntity &other) = delete;
|
||||||
|
|
||||||
|
operator const struct mpd_entity *() const {
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static std::list<ProxyEntity>
|
||||||
ReceiveEntities(struct mpd_connection *connection)
|
ReceiveEntities(struct mpd_connection *connection)
|
||||||
{
|
{
|
||||||
std::list<struct mpd_entity *> entities;
|
std::list<ProxyEntity> entities;
|
||||||
struct mpd_entity *entity;
|
struct mpd_entity *entity;
|
||||||
while ((entity = mpd_recv_entity(connection)) != NULL)
|
while ((entity = mpd_recv_entity(connection)) != NULL)
|
||||||
entities.push_back(entity);
|
entities.push_back(ProxyEntity(entity));
|
||||||
|
|
||||||
mpd_response_finish(connection);
|
mpd_response_finish(connection);
|
||||||
return entities;
|
return entities;
|
||||||
@ -287,14 +313,11 @@ Visit(struct mpd_connection *connection, struct directory &parent,
|
|||||||
if (!mpd_send_list_meta(connection, directory_get_path(&parent)))
|
if (!mpd_send_list_meta(connection, directory_get_path(&parent)))
|
||||||
return CheckError(connection, error_r);
|
return CheckError(connection, error_r);
|
||||||
|
|
||||||
std::list<struct mpd_entity *> entities = ReceiveEntities(connection);
|
std::list<ProxyEntity> entities(ReceiveEntities(connection));
|
||||||
if (!CheckError(connection, error_r)) {
|
if (!CheckError(connection, error_r))
|
||||||
for (auto entity : entities)
|
|
||||||
mpd_entity_free(entity);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
for (auto entity : entities) {
|
for (const auto &entity : entities) {
|
||||||
switch (mpd_entity_get_type(entity)) {
|
switch (mpd_entity_get_type(entity)) {
|
||||||
case MPD_ENTITY_TYPE_UNKNOWN:
|
case MPD_ENTITY_TYPE_UNKNOWN:
|
||||||
break;
|
break;
|
||||||
@ -316,8 +339,6 @@ Visit(struct mpd_connection *connection, struct directory &parent,
|
|||||||
visit_playlist, error_r);
|
visit_playlist, error_r);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
mpd_entity_free(entity);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return CheckError(connection, error_r);
|
return CheckError(connection, error_r);
|
||||||
|
Loading…
Reference in New Issue
Block a user