From fcf0f8291dc23d5db329cd44119d69dde76238b2 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 15 Aug 2012 21:59:56 +0200 Subject: ProxyDatabasePlugin: add OO wrapper for mpd_entity Let the C++ compiler take care for freeing the objects safely. --- src/db/ProxyDatabasePlugin.cxx | 43 +++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) (limited to 'src/db') diff --git a/src/db/ProxyDatabasePlugin.cxx b/src/db/ProxyDatabasePlugin.cxx index f09bb39d..6211f5c7 100644 --- a/src/db/ProxyDatabasePlugin.cxx +++ b/src/db/ProxyDatabasePlugin.cxx @@ -267,13 +267,39 @@ Visit(struct directory &parent, const struct mpd_playlist *playlist, return success; } -static std::list +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 ReceiveEntities(struct mpd_connection *connection) { - std::list entities; + std::list entities; struct mpd_entity *entity; while ((entity = mpd_recv_entity(connection)) != NULL) - entities.push_back(entity); + entities.push_back(ProxyEntity(entity)); mpd_response_finish(connection); return entities; @@ -287,14 +313,11 @@ Visit(struct mpd_connection *connection, struct directory &parent, if (!mpd_send_list_meta(connection, directory_get_path(&parent))) return CheckError(connection, error_r); - std::list entities = ReceiveEntities(connection); - if (!CheckError(connection, error_r)) { - for (auto entity : entities) - mpd_entity_free(entity); + std::list entities(ReceiveEntities(connection)); + if (!CheckError(connection, error_r)) return false; - } - for (auto entity : entities) { + for (const auto &entity : entities) { switch (mpd_entity_get_type(entity)) { case MPD_ENTITY_TYPE_UNKNOWN: break; @@ -316,8 +339,6 @@ Visit(struct mpd_connection *connection, struct directory &parent, visit_playlist, error_r); break; } - - mpd_entity_free(entity); } return CheckError(connection, error_r); -- cgit v1.2.3