From 1735a8c7db9028c8f91c39835d23f2a1f3b29396 Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Sun, 22 Aug 2010 22:04:57 +0200 Subject: [PATCH] handle possible errors while saving playlist properly --- src/mpdpp.cpp | 12 +++++++---- src/mpdpp.h | 2 +- src/ncmpcpp.cpp | 54 ++++++++++++++++++++++++++----------------------- 3 files changed, 38 insertions(+), 30 deletions(-) diff --git a/src/mpdpp.cpp b/src/mpdpp.cpp index 95978ac0..b86cb012 100644 --- a/src/mpdpp.cpp +++ b/src/mpdpp.cpp @@ -1027,7 +1027,7 @@ bool MPD::Connection::DeletePlaylist(const std::string &name) } } -bool MPD::Connection::SavePlaylist(const std::string &name) +int MPD::Connection::SavePlaylist(const std::string &name) { if (!itsConnection) return false; @@ -1035,8 +1035,12 @@ bool MPD::Connection::SavePlaylist(const std::string &name) GoBusy(); mpd_send_save(itsConnection, name.c_str()); mpd_response_finish(itsConnection); - return !(mpd_connection_get_error(itsConnection) == MPD_ERROR_SERVER - && mpd_connection_get_server_error(itsConnection) == MPD_SERVER_ERROR_EXIST); + + if (mpd_connection_get_error(itsConnection) == MPD_ERROR_SERVER + && mpd_connection_get_server_error(itsConnection) == MPD_SERVER_ERROR_EXIST) + return MPD_SERVER_ERROR_EXIST; + else + return CheckForErrors(); } void MPD::Connection::GetPlaylists(TagList &v) @@ -1295,7 +1299,7 @@ void MPD::Connection::GetTagTypes(TagList &v) int MPD::Connection::CheckForErrors() { - int error_code = 0; + int error_code = MPD_ERROR_SUCCESS; if ((error_code = mpd_connection_get_error(itsConnection)) != MPD_ERROR_SUCCESS) { itsErrorMessage = mpd_connection_get_error_message(itsConnection); diff --git a/src/mpdpp.h b/src/mpdpp.h index b9c0512d..6804db4b 100644 --- a/src/mpdpp.h +++ b/src/mpdpp.h @@ -184,7 +184,7 @@ namespace MPD bool CommitCommandsList(); bool DeletePlaylist(const std::string &); - bool SavePlaylist(const std::string &); + int SavePlaylist(const std::string &); void ClearPlaylist(const std::string &); void AddToPlaylist(const std::string &, const Song &); void AddToPlaylist(const std::string &, const std::string &); diff --git a/src/ncmpcpp.cpp b/src/ncmpcpp.cpp index 9a13f793..84ffc2a7 100644 --- a/src/ncmpcpp.cpp +++ b/src/ncmpcpp.cpp @@ -870,37 +870,41 @@ int main(int argc, char *argv[]) if (Mpd.GetErrorMessage().empty()) ShowMessage("Filtered items added to playlist \"%s\"", playlist_name.c_str()); } - else if (Mpd.SavePlaylist(real_playlist_name)) - { - ShowMessage("Playlist saved as: %s", playlist_name.c_str()); - if (myPlaylistEditor->Main()) // check if initialized - myPlaylistEditor->Playlists->Clear(); // make playlist's list update itself - } else { - LockStatusbar(); - Statusbar() << "Playlist already exists, overwrite: " << playlist_name << " ? [" << fmtBold << 'y' << fmtBoldEnd << '/' << fmtBold << 'n' << fmtBoldEnd << "] "; - wFooter->Refresh(); - int answer = 0; - while (answer != 'y' && answer != 'n') + int result = Mpd.SavePlaylist(real_playlist_name); + if (result == MPD_ERROR_SUCCESS) { - TraceMpdStatus(); - wFooter->ReadKey(answer); + ShowMessage("Playlist saved as: %s", playlist_name.c_str()); + if (myPlaylistEditor->Main()) // check if initialized + myPlaylistEditor->Playlists->Clear(); // make playlist's list update itself } - UnlockStatusbar(); - - if (answer == 'y') + else if (result == MPD_SERVER_ERROR_EXIST) { - Mpd.DeletePlaylist(real_playlist_name); - if (Mpd.SavePlaylist(real_playlist_name)) - ShowMessage("Playlist overwritten!"); + LockStatusbar(); + Statusbar() << "Playlist already exists, overwrite: " << playlist_name << " ? [" << fmtBold << 'y' << fmtBoldEnd << '/' << fmtBold << 'n' << fmtBoldEnd << "] "; + wFooter->Refresh(); + int answer = 0; + while (answer != 'y' && answer != 'n') + { + TraceMpdStatus(); + wFooter->ReadKey(answer); + } + UnlockStatusbar(); + + if (answer == 'y') + { + Mpd.DeletePlaylist(real_playlist_name); + if (Mpd.SavePlaylist(real_playlist_name) == MPD_ERROR_SUCCESS) + ShowMessage("Playlist overwritten!"); + } + else + ShowMessage("Aborted!"); + if (myPlaylistEditor->Main()) // check if initialized + myPlaylistEditor->Playlists->Clear(); // make playlist's list update itself + if (myScreen == myPlaylist) + myPlaylist->EnableHighlighting(); } - else - ShowMessage("Aborted!"); - if (myPlaylistEditor->Main()) // check if initialized - myPlaylistEditor->Playlists->Clear(); // make playlist's list update itself - if (myScreen == myPlaylist) - myPlaylist->EnableHighlighting(); } } if (myBrowser->Main()