From 48538b851eee960b84f066188512e358b6c01181 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Mon, 20 Mar 2017 21:45:50 +0100 Subject: [PATCH] screen_queue: move playlist_save() to save_playlist.c --- Makefile.am | 1 + po/POTFILES.in | 1 + src/save_playlist.c | 175 ++++++++++++++++++++++++++++++++++++++++++++ src/save_playlist.h | 28 +++++++ src/screen_file.c | 2 +- src/screen_queue.c | 123 +------------------------------ src/screen_queue.h | 5 -- 7 files changed, 207 insertions(+), 128 deletions(-) create mode 100644 src/save_playlist.c create mode 100644 src/save_playlist.h diff --git a/Makefile.am b/Makefile.am index 46f8be6..a72ecab 100644 --- a/Makefile.am +++ b/Makefile.am @@ -54,6 +54,7 @@ src_ncmpc_SOURCES = \ src/screen_browser.c src/screen_browser.h \ src/screen_file.c src/screen_file.h \ src/list_window.c src/list_window.h \ + src/save_playlist.c src/save_playlist.h \ src/paint.h \ src/song_paint.c src/song_paint.h \ src/colors.c src/colors.h \ diff --git a/po/POTFILES.in b/po/POTFILES.in index d3af0cb..1ea275c 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -8,6 +8,7 @@ src/list_window.c src/main.c src/options.c src/player_command.c +src/save_playlist.c src/screen.c src/screen_artist.c src/screen_browser.c diff --git a/src/save_playlist.c b/src/save_playlist.c new file mode 100644 index 0000000..b7b7634 --- /dev/null +++ b/src/save_playlist.c @@ -0,0 +1,175 @@ +/* ncmpc (Ncurses MPD Client) + * (c) 2004-2017 The Music Player Daemon Project + * Project homepage: http://musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "save_playlist.h" +#include "screen_status.h" +#include "config.h" +#include "i18n.h" +#include "charset.h" +#include "mpdclient.h" +#include "utils.h" +#include "wreadln.h" +#include "screen_utils.h" +#include "Compiler.h" + +#include + +#include + +#include + +#ifndef NCMPC_MINI + +typedef struct +{ + GList **list; + struct mpdclient *c; +} completion_callback_data_t; + +/** + * Wrapper for strncmp(). We are not allowed to pass &strncmp to + * g_completion_set_compare(), because strncmp() takes size_t where + * g_completion_set_compare passes a gsize value. + */ +static gint +completion_strncmp(const gchar *s1, const gchar *s2, gsize n) +{ + return strncmp(s1, s2, n); +} + +static void +save_pre_completion_cb(GCompletion *gcmp, gcc_unused gchar *line, + void *data) +{ + completion_callback_data_t *tmp = (completion_callback_data_t *)data; + GList **list = tmp->list; + struct mpdclient *c = tmp->c; + + if( *list == NULL ) { + /* create completion list */ + *list = gcmp_list_from_path(c, "", NULL, GCMP_TYPE_PLAYLIST); + g_completion_add_items(gcmp, *list); + } +} + +static void +save_post_completion_cb(gcc_unused GCompletion *gcmp, + gcc_unused gchar *line, GList *items, + gcc_unused void *data) +{ + if (g_list_length(items) >= 1) + screen_display_completion_list(items); +} + +#endif + +int +playlist_save(struct mpdclient *c, char *name, char *defaultname) +{ + struct mpd_connection *connection; + gchar *filename; + +#ifdef NCMPC_MINI + (void)defaultname; +#endif + +#ifndef NCMPC_MINI + if (name == NULL) { + /* initialize completion support */ + GCompletion *gcmp = g_completion_new(NULL); + g_completion_set_compare(gcmp, completion_strncmp); + GList *list = NULL; + completion_callback_data_t data = { + .list = &list, + .c = c, + }; + wrln_completion_callback_data = &data; + wrln_pre_completion_callback = save_pre_completion_cb; + wrln_post_completion_callback = save_post_completion_cb; + + + /* query the user for a filename */ + filename = screen_readln(_("Save queue as"), + defaultname, + NULL, + gcmp); + + /* destroy completion support */ + wrln_completion_callback_data = NULL; + wrln_pre_completion_callback = NULL; + wrln_post_completion_callback = NULL; + g_completion_free(gcmp); + list = string_list_free(list); + if( filename ) + filename=g_strstrip(filename); + } else +#endif + filename=g_strdup(name); + + if (filename == NULL) + return -1; + + /* send save command to mpd */ + + connection = mpdclient_get_connection(c); + if (connection == NULL) { + g_free(filename); + return -1; + } + + char *filename_utf8 = locale_to_utf8(filename); + if (!mpd_run_save(connection, filename_utf8)) { + if (mpd_connection_get_error(connection) == MPD_ERROR_SERVER && + mpd_connection_get_server_error(connection) == MPD_SERVER_ERROR_EXIST && + mpd_connection_clear_error(connection)) { + char *buf = g_strdup_printf(_("Replace %s?"), filename); + bool replace = screen_get_yesno(buf, false); + g_free(buf); + + if (!replace) { + g_free(filename_utf8); + g_free(filename); + screen_status_printf(_("Aborted")); + return -1; + } + + if (!mpd_run_rm(connection, filename_utf8) || + !mpd_run_save(connection, filename_utf8)) { + mpdclient_handle_error(c); + g_free(filename_utf8); + g_free(filename); + return -1; + } + } else { + mpdclient_handle_error(c); + g_free(filename_utf8); + g_free(filename); + return -1; + } + } + + c->events |= MPD_IDLE_STORED_PLAYLIST; + + g_free(filename_utf8); + + /* success */ + screen_status_printf(_("Saved %s"), filename); + g_free(filename); + return 0; +} diff --git a/src/save_playlist.h b/src/save_playlist.h new file mode 100644 index 0000000..3854333 --- /dev/null +++ b/src/save_playlist.h @@ -0,0 +1,28 @@ +/* ncmpc (Ncurses MPD Client) + * (c) 2004-2017 The Music Player Daemon Project + * Project homepage: http://musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef SAVE_PLAYLIST_H +#define SAVE_PLAYLIST_H + +struct mpdclient; + +int +playlist_save(struct mpdclient *c, char *name, char *defaultname); + +#endif diff --git a/src/screen_file.c b/src/screen_file.c index 2af1655..b23a1c8 100644 --- a/src/screen_file.c +++ b/src/screen_file.c @@ -21,7 +21,7 @@ #include "screen_browser.h" #include "screen_interface.h" #include "screen_status.h" -#include "screen_queue.h" +#include "save_playlist.h" #include "screen.h" #include "config.h" #include "i18n.h" diff --git a/src/screen_queue.c b/src/screen_queue.c index 45505ee..3d20da3 100644 --- a/src/screen_queue.c +++ b/src/screen_queue.c @@ -22,6 +22,7 @@ #include "screen_file.h" #include "screen_status.h" #include "screen_find.h" +#include "save_playlist.h" #include "config.h" #include "i18n.h" #include "charset.h" @@ -180,32 +181,6 @@ screen_queue_song_change(const struct mpd_status *status) return true; } -#ifndef NCMPC_MINI -static void -save_pre_completion_cb(GCompletion *gcmp, gcc_unused gchar *line, - void *data) -{ - completion_callback_data_t *tmp = (completion_callback_data_t *)data; - GList **list = tmp->list; - struct mpdclient *c = tmp->c; - - if( *list == NULL ) { - /* create completion list */ - *list = gcmp_list_from_path(c, "", NULL, GCMP_TYPE_PLAYLIST); - g_completion_add_items(gcmp, *list); - } -} - -static void -save_post_completion_cb(gcc_unused GCompletion *gcmp, - gcc_unused gchar *line, GList *items, - gcc_unused void *data) -{ - if (g_list_length(items) >= 1) - screen_display_completion_list(items); -} -#endif - #ifndef NCMPC_MINI /** * Wrapper for strncmp(). We are not allowed to pass &strncmp to @@ -219,102 +194,6 @@ completion_strncmp(const gchar *s1, const gchar *s2, gsize n) } #endif -int -playlist_save(struct mpdclient *c, char *name, char *defaultname) -{ - struct mpd_connection *connection; - gchar *filename; - -#ifdef NCMPC_MINI - (void)defaultname; -#endif - -#ifndef NCMPC_MINI - if (name == NULL) { - /* initialize completion support */ - GCompletion *gcmp = g_completion_new(NULL); - g_completion_set_compare(gcmp, completion_strncmp); - GList *list = NULL; - completion_callback_data_t data = { - .list = &list, - .dir_list = NULL, - .c = c, - }; - wrln_completion_callback_data = &data; - wrln_pre_completion_callback = save_pre_completion_cb; - wrln_post_completion_callback = save_post_completion_cb; - - - /* query the user for a filename */ - filename = screen_readln(_("Save queue as"), - defaultname, - NULL, - gcmp); - - /* destroy completion support */ - wrln_completion_callback_data = NULL; - wrln_pre_completion_callback = NULL; - wrln_post_completion_callback = NULL; - g_completion_free(gcmp); - list = string_list_free(list); - if( filename ) - filename=g_strstrip(filename); - } else -#endif - filename=g_strdup(name); - - if (filename == NULL) - return -1; - - /* send save command to mpd */ - - connection = mpdclient_get_connection(c); - if (connection == NULL) { - g_free(filename); - return -1; - } - - char *filename_utf8 = locale_to_utf8(filename); - if (!mpd_run_save(connection, filename_utf8)) { - if (mpd_connection_get_error(connection) == MPD_ERROR_SERVER && - mpd_connection_get_server_error(connection) == MPD_SERVER_ERROR_EXIST && - mpd_connection_clear_error(connection)) { - char *buf = g_strdup_printf(_("Replace %s?"), filename); - bool replace = screen_get_yesno(buf, false); - g_free(buf); - - if (!replace) { - g_free(filename_utf8); - g_free(filename); - screen_status_printf(_("Aborted")); - return -1; - } - - if (!mpd_run_rm(connection, filename_utf8) || - !mpd_run_save(connection, filename_utf8)) { - mpdclient_handle_error(c); - g_free(filename_utf8); - g_free(filename); - return -1; - } - } else { - mpdclient_handle_error(c); - g_free(filename_utf8); - g_free(filename); - return -1; - } - } - - c->events |= MPD_IDLE_STORED_PLAYLIST; - - g_free(filename_utf8); - - /* success */ - screen_status_printf(_("Saved %s"), filename); - g_free(filename); - return 0; -} - #ifndef NCMPC_MINI static void add_dir(GCompletion *gcmp, gchar *dir, GList **dir_list, GList **list, struct mpdclient *c) diff --git a/src/screen_queue.h b/src/screen_queue.h index f37f1d5..d7d135a 100644 --- a/src/screen_queue.h +++ b/src/screen_queue.h @@ -20,11 +20,6 @@ #ifndef NCMPC_SCREEN_QUEUE_H #define NCMPC_SCREEN_QUEUE_H -struct mpdclient; - extern const struct screen_functions screen_queue; -int -playlist_save(struct mpdclient *c, char *name, char *defaultname); - #endif -- 2.30.2