expand(output, action, ds);
}
-/* actions ********************************************************************/
-
-static void act_prefs_errors(const char *msg,
- void attribute((unused)) *u) {
- fatal(0, "error splitting parts list: %s", msg);
-}
-
-static const char *numbered_arg(const char *argname, int numfile) {
- char *fullname;
-
- byte_xasprintf(&fullname, "%d_%s", numfile, argname);
- return cgi_get(fullname);
-}
-
-static void process_prefs(dcgi_state *ds, int numfile) {
- const char *file, *name, *value, *part, *parts, *current, *context;
- char **partslist;
-
- if(!(file = numbered_arg("file", numfile)))
- /* The first file doesn't need numbering. */
- if(numfile > 0 || !(file = cgi_get("file")))
- return;
- if((parts = numbered_arg("parts", numfile))
- || (parts = cgi_get("parts"))) {
- /* Default context is display. Other contexts not actually tested. */
- if(!(context = numbered_arg("context", numfile))) context = "display";
- partslist = split(parts, 0, 0, act_prefs_errors, 0);
- while((part = *partslist++)) {
- if(!(value = numbered_arg(part, numfile)))
- continue;
- /* If it's already right (whether regexps or db) don't change anything,
- * so we don't fill the database up with rubbish. */
- if(disorder_part(ds->g->client, (char **)¤t,
- file, context, part))
- fatal(0, "disorder_part() failed");
- if(!strcmp(current, value))
- continue;
- byte_xasprintf((char **)&name, "trackname_%s_%s", context, part);
- disorder_set(ds->g->client, file, name, value);
- }
- if((value = numbered_arg("random", numfile)))
- disorder_unset(ds->g->client, file, "pick_at_random");
- else
- disorder_set(ds->g->client, file, "pick_at_random", "0");
- if((value = numbered_arg("tags", numfile))) {
- if(!*value)
- disorder_unset(ds->g->client, file, "tags");
- else
- disorder_set(ds->g->client, file, "tags", value);
- }
- if((value = numbered_arg("weight", numfile))) {
- if(!*value || !strcmp(value, "90000"))
- disorder_unset(ds->g->client, file, "weight");
- else
- disorder_set(ds->g->client, file, "weight", value);
- }
- } else if((name = cgi_get("name"))) {
- /* Raw preferences. Not well supported in the templates at the moment. */
- value = cgi_get("value");
- if(value)
- disorder_set(ds->g->client, file, name, value);
- else
- disorder_unset(ds->g->client, file, name);
- }
-}
-
-static void act_prefs(cgi_sink *output, dcgi_state *ds) {
- const char *files;
- int nfiles, numfile;
-
- if((files = cgi_get("files"))) nfiles = atoi(files);
- else nfiles = 1;
- for(numfile = 0; numfile < nfiles; ++numfile)
- process_prefs(ds, numfile);
- cgi_header(output->sink, "Content-Type", "text/html");
- header_cookie(output->sink);
- cgi_body(output->sink);
- expand(output, "prefs", ds);
-}
/* expansions *****************************************************************/
-static void exp_label(int attribute((unused)) nargs,
- char **args,
- cgi_sink *output,
- void attribute((unused)) *u) {
- cgi_output(output, "%s", cgi_label(args[0]));
-}
-
struct trackinfo_state {
dcgi_state *ds;
const struct queue_entry *q;