redirect(0);
}
+static void act_remove(void) {
+ const char *id;
+ struct queue_entry *q;
+
+ if(dcgi_client) {
+ if(!(id = cgi_get("id")))
+ error(0, "missing 'id' argument");
+ else if(!(q = dcgi_findtrack(id)))
+ error(0, "unknown queue id %s", id);
+ else switch(q->state) {
+ case playing_isscratch:
+ case playing_failed:
+ case playing_no_player:
+ case playing_ok:
+ case playing_quitting:
+ case playing_scratched:
+ error(0, "does not make sense to scratch %s", id);
+ break;
+ case playing_paused: /* started but paused */
+ case playing_started: /* started to play */
+ disorder_scratch(dcgi_client, id);
+ break;
+ case playing_random: /* unplayed randomly chosen track */
+ case playing_unplayed: /* haven't played this track yet */
+ disorder_remove(dcgi_client, id);
+ break;
+ }
+ }
+ redirect(0);
+}
+
/** @brief Table of actions */
static const struct action {
/** @brief Action name */
{ "enable", act_enable },
{ "manage", act_playing },
{ "playing", act_playing },
- { "random-disable", act_random_disable },
- { "random-enable", act_random_enable },
+ { "randomdisable", act_random_disable },
+ { "randomenable", act_random_enable },
+ { "remove", act_remove },
};
/** @brief Expand a template
*/
void dcgi_expand(const char *name) {
const char *p;
-
+
+ /* Parse macros first */
+ mx_expand_file("macros.tmpl", sink_discard(), 0);
/* For unknown actions check that they aren't evil */
for(p = name; *p && isalnum((unsigned char)*p); ++p)
;
}
/** @brief Generate an error page */
-void dcgi_error(const char *msg, ...) {
- va_list ap;
-
- va_start(ap, msg);
- byte_xvasprintf(&dcgi_error_string, msg, ap);
- va_end(ap);
+void dcgi_error(const char *key) {
+ dcgi_error_string = xstrdup(key);
dcgi_expand("error");
}