From 9439cdabec3e4c1d29e4366f9b654ef27eb2c586 Mon Sep 17 00:00:00 2001 Message-Id: <9439cdabec3e4c1d29e4366f9b654ef27eb2c586.1715280347.git.mdw@distorted.org.uk> From: Mark Wooding Date: Sun, 31 Jul 2011 14:43:15 +0100 Subject: [PATCH] server: setting playing and random-play global prefs now works properly. Organization: Straylight/Edgeware From: Richard Kettlewell Formerly the global prefs would be changed but the other actions required to switch state properly were not carried out. This was documented, making it a design flaw rather than an implementation error. --- doc/disorder_preferences.5.in | 2 -- server/disorder-server.h | 7 +++++-- server/play.c | 16 ++++++++-------- server/server.c | 21 ++++++++++++++------- 4 files changed, 27 insertions(+), 19 deletions(-) diff --git a/doc/disorder_preferences.5.in b/doc/disorder_preferences.5.in index 9fbe6fb..3ce67d9 100644 --- a/doc/disorder_preferences.5.in +++ b/doc/disorder_preferences.5.in @@ -92,12 +92,10 @@ the listed tags. .B playing If unset or \fByes\fR then play is enabled. Otherwise it is disabled. -Use \fBdisable\fR rather than setting it directly. .TP .B random\-play If unset or \fByes\fR then random play is enabled. Otherwise it is disabled. -Use \fBdisable\fR rather than setting it directly. .PP Global preferences starting '_' are read-only (in the sense that you cannot modify them; the server may modify them as part of its normal operation). diff --git a/server/disorder-server.h b/server/disorder-server.h index 2e7374e..bc90c9b 100644 --- a/server/disorder-server.h +++ b/server/disorder-server.h @@ -179,13 +179,16 @@ void play(ev_source *ev); /* try to play something, if playing is enabled and nothing is playing * already */ +/** @brief Return true if @p represents a true flag */ +int flag_enabled(const char *s); + int playing_is_enabled(void); /* return true iff playing is enabled */ void enable_playing(const char *who, ev_source *ev); /* enable playing */ -void disable_playing(const char *who); +void disable_playing(const char *who, ev_source *ev); /* disable playing. */ int random_is_enabled(void); @@ -194,7 +197,7 @@ int random_is_enabled(void); void enable_random(const char *who, ev_source *ev); /* enable random play */ -void disable_random(const char *who); +void disable_random(const char *who, ev_source *ev); /* disable random play */ void scratch(const char *who, const char *id); diff --git a/server/play.c b/server/play.c index 8406238..9b919d1 100644 --- a/server/play.c +++ b/server/play.c @@ -640,11 +640,13 @@ void play(ev_source *ev) { /* Miscelleneous ------------------------------------------------------------ */ +int flag_enabled(const char *s) { + return !s || !strcmp(s, "yes"); +} + /** @brief Return true if play is enabled */ int playing_is_enabled(void) { - const char *s = trackdb_get_global("playing"); - - return !s || !strcmp(s, "yes"); + return flag_enabled(trackdb_get_global("playing")); } /** @brief Enable play */ @@ -656,15 +658,13 @@ void enable_playing(const char *who, ev_source *ev) { } /** @brief Disable play */ -void disable_playing(const char *who) { +void disable_playing(const char *who, ev_source attribute((unused)) *ev) { trackdb_set_global("playing", "no", who); } /** @brief Return true if random play is enabled */ int random_is_enabled(void) { - const char *s = trackdb_get_global("random-play"); - - return !s || !strcmp(s, "yes"); + return flag_enabled(trackdb_get_global("random-play")); } /** @brief Enable random play */ @@ -675,7 +675,7 @@ void enable_random(const char *who, ev_source *ev) { } /** @brief Disable random play */ -void disable_random(const char *who) { +void disable_random(const char *who, ev_source attribute((unused)) *ev) { trackdb_set_global("random-play", "no", who); } diff --git a/server/server.c b/server/server.c index d8a84ea..239c54e 100644 --- a/server/server.c +++ b/server/server.c @@ -201,9 +201,9 @@ static int reader_error(ev_source attribute((unused)) *ev, static int c_disable(struct conn *c, char **vec, int nvec) { if(nvec == 0) - disable_playing(c->who); + disable_playing(c->who, c->ev); else if(nvec == 1 && !strcmp(vec[0], "now")) - disable_playing(c->who); + disable_playing(c->who, c->ev); else { sink_writes(ev_writer_sink(c->w), "550 invalid argument\n"); return 1; /* completed */ @@ -866,7 +866,7 @@ static int c_random_enable(struct conn *c, static int c_random_disable(struct conn *c, char attribute((unused)) **vec, int attribute((unused)) nvec) { - disable_random(c->who); + disable_random(c->who, c->ev); sink_writes(ev_writer_sink(c->w), "250 OK\n"); return 1; /* completed */ } @@ -1150,10 +1150,17 @@ static int c_set_global(struct conn *c, sink_writes(ev_writer_sink(c->w), "550 cannot set internal global preferences\n"); return 1; } - if(trackdb_set_global(vec[0], vec[1], c->who)) - sink_printf(ev_writer_sink(c->w), "250 OK\n"); - else - sink_writes(ev_writer_sink(c->w), "550 not found\n"); + /* We special-case the 'magic' preferences here. */ + if(!strcmp(vec[0], "playing")) { + (flag_enabled(vec[1]) ? enable_playing : disable_playing)(c->who, c->ev); + } else if(!strcmp(vec[0], "random-play")) { + (flag_enabled(vec[1]) ? enable_random : disable_random)(c->who, c->ev); + } else { + if(trackdb_set_global(vec[0], vec[1], c->who)) + sink_printf(ev_writer_sink(c->w), "250 OK\n"); + else + sink_writes(ev_writer_sink(c->w), "550 not found\n"); + } return 1; } -- [mdw]