From: Richard Kettlewell Date: Sun, 31 Jul 2011 13:43:15 +0000 (+0100) Subject: server: setting playing and random-play global prefs now works X-Git-Tag: branchpoint-5.1~37^2~2 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/commitdiff_plain/9439cdabec3e4c1d29e4366f9b654ef27eb2c586 server: setting playing and random-play global prefs now works properly. 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. --- 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; }