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.
.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).
/* 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);
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);
/* 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 */
}
/** @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 */
}
/** @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);
}
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 */
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 */
}
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;
}